第一次在掘金写文章很紧张,于是决定...说一小段前言来缓解一下!
我相信有很多同志都很想迈入全栈一行,不仅仅是因为兴趣,同时也有需求希望更加的学习。
于是乎在百度了各种各样的教程视频,学习资料后,我们肯定会找上这么一项技术,也就是这篇文章的核心:
一、什么是Mongodb?它能够为我们带来如何的便利?
1.1 什么是Mongodb?
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。
1.2 它能够为我们带来如何的便利?
MongoDB带来的好处太多了,以下列举几条:
- MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
- Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
- 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。
- 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
?不列举缺点,不是没有,只是觉得...一会吹一会损的不太人道(哈哈哈)网上关于这方面的很多,其实要总结的话那就太长了,于是这里就不一一举例了。
二、第一步,搭建Mongodb,为之后的操作做好充分准备。
以下文件路径皆以我自己Mac上的为例子,大家可以自行配置。
这里使用的homebrew安装方式来进行安装
2.1 打开终端命令行,输入以下代码:
brew install mongodb
复制代码
安装完成后我们在当前终端看看咱们有没有安装成功:
mongod -h
复制代码
安装完成后指定一处数据路径和日志路径,因为你总要把数据以及日志放在一个地方对吧?
2.2 指定一处数据路径和日志路径。
在桌面新建一个Mongodb文件,完成后cd进入该文件,在Mongodb文件内创建一个名为data的文件夹,这便是我们指定的数据路径和日志路径存放的地方了,输入以下代码:
mongod -dbpath="./data"
复制代码
当我们出现下图这样的显示后,很开心的告诉你,咱们的前戏成了,可以开GTR了?:
这个窗口不能关闭,因为当前此终端命令行相当于mongodb的服务了,关闭它,跟停止mongodb的服务没啥区别了。
OK,咱们总结一下知识点,这两步操作具体都做了什么。
-
第一步通过brew的方式下载了mongodb,与其他安装不同的是,我选择了命令行安装而不是下载官方的解压包进行安装。
-
安装完成后,理所当然的,既然是数据库那么肯定有数据和日志,我们需要让它们 被我们指定到一个地方,好进行管理和以后的一些操作,而帮我们指定存放点的代码就是 mongod -dbpath="你自己的路径"
三、第二步,让你看到数据的可视化工具?不,一个网页即可。
数据库我们已经搭好了,如何才能看到我们的数据库中的数据?
还记得刚才第一步当中的创建的Mongodb文件吗?新建一个终端 cd 到当前Mongodb下,输入神秘代码:
mongo
执行代码后:
看到这里大家估计都知道了,mongodb可以通过命令查询数据。
列举五个常用的命令:
- show dbs(查询所有数据库列表)
- db(查看当前连接哪个数据库)
- use 数据库名字 (切换到某个数据库下面)
- show collections (查看当前数据库下有哪些表)
- db.help() (当前数据库支持方法)
当然Mongodb命令行是有查询语句的(没有就奇怪了),为什么不列举?是因为我们有一个更好的工具:adminMongo
adminMongo 是一个 Mongodb的可视化工具,轻巧,便携,可满足日常开发的基础工具
npm install admin-mongo
npm i
npm start
复制代码
?下载三连,大家都懂了吧,GTR开的可快了吧?
说回正题,下载完成后,启动项目我们可以看见界面呈这样的:
在这里我们可以进行一些创建库,删除库,创建表等等之类的操作。
3.1 创建一条用户数据
以我自己的nextHuafo数据库为例点击右边nextHuafo来到当前数据库的总页面:
在此处创建一张users表:
在当前users表中插入一条用户数据:
?大功告成,我们的第一条数据就这么插入成功了。
?如果你到这就已经很开心了,甚至很兴奋,我们不妨把车速提上一个档次,接下来,就该前后端开始联动了。
四、第三步,万事俱备,只欠东风,是时候开始联动(请求)数据了。
4.1 搭建项目并下载express or mongoose。
npm install express
npm install mongoose
用express来管理后面我们写好接口的路由最合适不过了(所以我这标题是不是该叫express+Mongodb..)
mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具
下载好后来看一下我的项目配置,这里我为了方便采用了VueCli3.0来直接构建的项目,以下为项目路径:
?在这里我们新建一个server文件来存放对于数据库的一些操作,那么在接下来的步骤前,我希望能够为大家先理一下整体思路。
我们需要做五步操作:
- 连接数据库。
- 创建数据模块Model,编写需要的业务功能代码。
- 获取请求参数,代入写好的功能中进行条件返回。
- 设置express路由,通过路由的方式把当前方法变成我们可以请求的接口。
- postman进行查询。
4.2 连接数据库
在 server 文件夹下新建一个 Connection.js 文件用于连接数据库,在当前js中,我们需要用到之前我们下载的 mongoose 进行连接并使用 mongoose.connect (连接数据库方法) 进行数据库连接,
var mongoose = require('mongoose')
/**** 声明自己的Mongodb数据库本地链接 *****/
var mongooseUrl = 'mongodb://127.0.0.1:27017/nextHuafo'
/**** 链接 *****/
mongoose.connect(mongooseUrl, {useNewUrlParser: true}, (err) => {
if(err){
console.log('Connection Error:' + err)
}else{
console.log('Connection success!') }
})
复制代码
使用 mongoose.connection.on('connected') 来监听自己数据库到底有没有连接成功。
mongoose.connection.on('connected',()=>{
console.log('数据库连接成功')
})
复制代码
或者你也可以监听一下连接失败
mongoose.connection.on('err',()=>{
console.log('数据库连接失败')
})
复制代码
然后我们把我们连接好的 mongoose 导出。
module.exports = mongoose
复制代码
最后连接数据库的 Connection.js 就是这样的:
var mongoose = require('mongoose')
var mongooseUrl = 'mongodb://127.0.0.1:27017/nextHuafo'
mongoose.connect(mongooseUrl, {useNewUrlParser: true}, (err) => {
if(err){
console.log('Connection Error:' + err)
}else{
console.log('Connection success!') }
})
/******链接成功*******/
mongoose.connection.on('connected',()=>{
console.log('数据库连接成功')
})
/******链接失败*******/
mongoose.connection.on('err',()=>{
console.log('数据库连接失败')
})
module.exports = mongoose
复制代码
4.3 创建数据模块Model,编写需要的业务功能代码。
在 server 文件下我们创建一个Schema文件,这个文件用于存放我们针对不同模块所写的不同的业务功能代码以及对应模块数据模型,先看一眼目前的目录吧:
在 Schema 文件下创建我们这次需要的用户文件名为 user 并在其目录下创建 user.js :
好了,这就是我们所说的模型文件 Schema 了,稍微来说一下 Schema 吧。
schema 是 mongoose 里会用到的一种数据模式,可以理解为表结构的定义;每个 schema 会映射到 mongodb 中的一个 collection ,它不具备操作数据库的能力
在 mongoose 里一切都由 schema 开始。每一个 schema 对应一个 mongoDB collection 并且在那个 collection 里面定义了 documents 的模型。
?总结一下,这里可能就用一句话概括:
schema 不具备操作数据库的能力,它是为了定义当前 collection 表结构的一种数据模型。
在user.js中引入刚刚我们定义的连接数据库文件。
const mongoose = require('./server/Connection.js') //不是真实路径,根据自己条件修改
复制代码
然后来定义一个 Schema 模型。
const User = mongoose.model('user',{
username:String,
password:String,
isLogin:Boolean
})
复制代码
model () 是为了让我们可以把已经定义好的 Schema 转换成我们可以使用的 model
上面的方法等同于:
var userSchema = new Schema({ // Schema头字母大写,因为Schema是构造函数
username: String,
password: String,
isLogin: String,
});
var User = mongoose.model('user', userSchema);
复制代码
注意! mongoose 在这里会自动给你加上复数,也就是说这里的 model( 'user' , {} ) 等于 model( ' users ' , { } ) 一定要注意这个细节。
好了?,关于users,我们已经定义好了,现在该做的,就是写我们需要的users 方法了,我们就先写一个简单的查询吧!
还是刚刚的 user.js 继续在这文件里写。
//查询方法
const findUser = (userInfo, callback) => {
User.findOne(userInfo).then((res) => {
callback(res)
})
}
//导出
module.exports = {
findUser
}
复制代码
接下来会非常快速的进行3.4.5流程的概括,然后在总结,GTR准备奔驰起来了!。
4.4 获取请求参数,代入写好的功能中进行条件返回。
这就是查询方法了,我们先不去深追究这个,我们接下来,再创建一个 userApi.js 的文件并引入刚刚的 user.js
const userModel = require('./user')
复制代码
继续,我们编写当请求接收后,根据数据库返回的条件进行前端返回的提示信息。
const login = (req, res) => {
let {username, password,status} = req.body
userModel.findUser({username}, (user) => {
if (!user) {
res.json({
code: 201,
msg: '用户名不存在'
})
} else {
if (user.password == password) {
res.cookie('user', username)
res.json({
code: 200,
msg: '登录成功!'
})
} else {
res.json({
code: 202,
msg: '密码错误'
})
}
}
})
}
//导出login方法
module.exports = {
login,
}
复制代码
4.5 设置express路由,通过路由的方式把当前方法变成我们可以请求的接口。
在 user.js 的上一级,我们新建一个 router.js 文件 用于存放express路由,而当我们请求这些路由的时候,也就是在请求我们写的方法。
var express = require('express') //引入express
var router = express.Router() //定义express路由
var userController = require('./user/userApi') //引入刚刚的userApi.js
router.post('/login', userController.login) //通过路由的方式去请求我们写好的接收方法
//导出当前路由
module.exports = router
复制代码
这个时候咱们的工作就做的七七八八了,但是咱们总得跑起来吧!这么一项坚决的工作,就交给 express 中间件了,在最外层创建 app.js 中间件,并在中间件里创建 3030 端口,使用app.use() 方法将刚刚导出的路由关联起来,然后这事咱们也就算成了,来试试吧。
var express = require('express');
var cors = require('cors');
var app = express()
var mongoose = require('mongoose');
const bodyPaser = require('body-parser');
app.use(cors());
// app.use(bodyPaser.json) //在其他路由中间件前(尽可能靠前,以能够通过bodyPaser获取req.body)
// app.use(bodyPaser.urlencoded({ extended: false}))
app.use(bodyPaser.urlencoded({extended:true}));
app.get('/',function(req,res){
res.send("启动成功")
})
var usersRouter = require('./server/SchemaApi/router')
app.use('/api/user',usersRouter)
app.listen(3030,() => {
console.log("node 3030端口成功")
})
复制代码
node app.js //启动起来
复制代码
4.6 总结 3 . 4 . 5 步骤具体都在干什么。
好了,咱们代码也看了这么多了,是时候来说一下他们为什么都要这么写。
之前的查询方法为什么叫它查询方法?是因为 findOne()。
const findUser = (userInfo, callback) => {
User.findOne(userInfo).then((res) => {
callback(res)
})
}
复制代码
findOne ( ) 方法,findOne是返回符合条件的第一条记录
这其实就是 mongodb 提供的方法,在这里findOne ( ) 接收一个userInfo 参数 。
?OK,我们继续,userApi.js 里为什么会写接收请求的方法?
还记得我们的router.js吗?通过express的路由,来请求当前的文件,如果还是没有头绪我们再来看看这条代码。
var userController = require('./user/userApi')
router.post('/login', userController.login)
复制代码
结合 userApi.js的代码 来看:
const login = (req, res) => {
let {username, password,status} = req.body
userModel.findUser({username}, (user) => {
if (!user) {
res.json({
code: 201,
msg: '用户名不存在'
})
} else {
if (user.password == password) {
res.cookie('user', username)
res.json({
code: 200,
msg: '登录成功!'
})
} else {
res.json({
code: 202,
msg: '密码错误'
})
}
}
})
}
module.exports = {
login
}
复制代码
显而易见的,在 router.js 中 router.post ( ) 请求的正是导出的login方法,login方法接收两个参数,req和res。而我们的请求参数 便是 req.body。
到这里我们 express 路由便写好了,接下来只需要在中间件使用 app.use 关联一下就行了。
4.7 postman进行查询。
跑也跑起来了,写也写得差不多了,是时候监测一下自己的代码是否是正确的了,打开 postman 我们来检测一下自己的接口吧,同时也要看自己启动中间的终端哦!
???怎么回事?居然报错了?我写了这么大半天!你居然报错了!辣鸡文章我要举报你!假的!
当我们遇见这个问题时,看他报的什么错。
Cannot destructure property
username
of 'undefined' or 'null'.
这里请大家注意:
express4.0当中 req.body 被剥离出来了需要在app.js手动引入一下才能解析req.body
const bodyPaser = require('body-parser');
app.use(bodyPaser.urlencoded({extended:true}));
复制代码
在这两句代码加入你的app.js,如果没有 body-parser ,也可以 npm 下载一下(顺带说一句,我曾经把body-parser 写作 body-praser, 然后在那里纠结了半小时为啥我没有该模块...)
?OK,现在我们重启刚刚的node app.js 终端,然后 postman 请求一下,看可否正常运行了。
大功告成!?,如此一来,最为基本的mongodb操作方法我们就已经说完了。其实也如此简单,是不是没有想象中这么难?最后看看我的目录吧:
最后这项目也在 github 上,我新加了一些东西,大家可以看这个,求个star!嘿嘿嘿
那么,Mongodb 到这也就全部结束了,写了两天,因为自己第一次发文章所以很多都不熟悉,我作为一个彻底的前端码仔,写倒是会写,说出来的话可能就完全不专业了。
看了看大佬的文章和自己的这篇,差距感顿时就出来了,不过我依然感到兴奋,因为对于自己,我终于是迈出了这一步。
如果文中有错误,或者不仔细的地方,大家积极对我提出意见,我也需要成长,也会积极的去修改。
马上就要满20了,希望自己能永远保持这份激情。
愿各位始终拥有光亮,不惧怕,孑然一身亦使前程辉煌。