MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的状况下,添加更多的节点,能够保证服务器性能。前端
MongoDB带来的好处太多了,如下列举几条:node
👌不列举缺点,不是没有,只是以为...一会吹一会损的不太人道(哈哈哈)网上关于这方面的不少,其实要总结的话那就太长了,因而这里就不一一举例了。git
如下文件路径皆以我本身Mac上的为例子,你们能够自行配置。github
这里使用的homebrew安装方式来进行安装mongodb
brew install mongodb
复制代码
安装完成后咱们在当前终端看看我们有没有安装成功:数据库
mongod -h
复制代码
安装完成后指定一处数据路径和日志路径,由于你总要把数据以及日志放在一个地方对吧?express
在桌面新建一个Mongodb文件,完成后cd进入该文件,在Mongodb文件内建立一个名为data的文件夹,这即是咱们指定的数据路径和日志路径存放的地方了,输入如下代码:npm
mongod -dbpath="./data"
复制代码
当咱们出现下图这样的显示后,很开心的告诉你,我们的前戏成了,能够开GTR了👌: json
这个窗口不能关闭,由于当前此终端命令行至关于mongodb的服务了,关闭它,跟中止mongodb的服务没啥区别了。后端
第一步经过brew的方式下载了mongodb,与其余安装不一样的是,我选择了命令行安装而不是下载官方的解压包进行安装。
安装完成后,理所固然的,既然是数据库那么确定有数据和日志,咱们须要让它们 被咱们指定到一个地方,好进行管理和之后的一些操做,而帮咱们指定存放点的代码就是 mongod -dbpath="你本身的路径"
数据库咱们已经搭好了,如何才能看到咱们的数据库中的数据?
还记得刚才第一步当中的建立的Mongodb文件吗?新建一个终端 cd 到当前Mongodb下,输入神秘代码:
mongo
执行代码后:
看到这里你们估计都知道了,mongodb能够经过命令查询数据。
固然Mongodb命令行是有查询语句的(没有就奇怪了),为何不列举?是由于咱们有一个更好的工具:adminMongo
adminMongo 是一个 Mongodb的可视化工具,轻巧,便携,可知足平常开发的基础工具
npm install admin-mongo
npm i
npm start
复制代码
👌下载三连,你们都懂了吧,GTR开的可快了吧👌
说回正题,下载完成后,启动项目咱们能够看见界面呈这样的:
在这里咱们能够进行一些建立库,删除库,建立表等等之类的操做。
以我本身的nextHuafo数据库为例点击右边nextHuafo来到当前数据库的总页面:
在此处建立一张users表:
在当前users表中插入一条用户数据:
👌大功告成,咱们的第一条数据就这么插入成功了。
👌若是你到这就已经很开心了,甚至很兴奋,咱们不妨把车速提上一个档次,接下来,就该先后端开始联动了。
npm install express
npm install mongoose
用express来管理后面咱们写好接口的路由最合适不过了(因此我这标题是否是该叫express+Mongodb..)
mongoose是在node.js异步环境下对mongodb进行便捷操做的对象模型工具
下载好后来看一下个人项目配置,这里我为了方便采用了VueCli3.0来直接构建的项目,如下为项目路径:
👌在这里咱们新建一个server文件来存放对于数据库的一些操做,那么在接下来的步骤前,我但愿可以为你们先理一下总体思路。
咱们须要作五步操做:
在 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
复制代码
在 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准备奔驰起来了!。
这就是查询方法了,咱们先不去深追究这个,咱们接下来,再建立一个 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,
}
复制代码
在 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 //启动起来
复制代码
好了,我们代码也看了这么多了,是时候来讲一下他们为何都要这么写。
以前的查询方法为何叫它查询方法?是由于 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 关联一下就好了。
跑也跑起来了,写也写得差很少了,是时候监测一下本身的代码是不是正确的了,打开 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了,但愿本身能永远保持这份激情。
愿各位始终拥有光亮,不害怕,形单影只亦使前程辉煌。