基于mongoose完整的数据库操作流程
1. 使用脚手架搭建项目结构
$npm i express-generator -g //通过npm加载express脚手架插件
$express projectName -e //新建项目(渲染模板为ejs)
$npm i//项目目录下安装依赖包
2. 设置路由(router文件夹下操作)
var express = require('express')//路由文件中引入express插件
var router = express.Router()//express插件下router方法产生对象
router.route('/')//设置路由路径,并根据restfulAPI规则设置增删改查对应接口
.post((req,res,next)=>{
res.render('expamle',{data});//响应,example为view文件夹下的文件名,同时附带传递data
})
.get()
.del()
.put()
module.exports = router//导出路由
3. 启动静态服务器
app.js文件中,需要将配置的路由引入并使用
const loginRouster = require('路由文件路径')//引入路由
app.use('/login',loginRouster)//app中间件使用路由,第一个参数为路由路径,第二个参数为对应路由
$npm run start//终端命令运行package.json中的js脚本,启动服务器
4. 设置前端页面
要实现数据库操作,前后端数据交互是必须的,所以需要使用ajax技术
$.ajax({
type: "POST", //对应路由方法
url: "http://localhost:3000/signin",//将信息传递给后端页面
data: {//以对象的形式向后端传输数据
phone:$('.phone').val(),
pw:$('.pw').val()
},
dataType: 'json',
success: function (data) {} //回调函数,对返回信息操作
});
需要注意的是,前后端交互中会出先因为浏览器同源策略导致的跨域问题,这里可以通过CORS插件进行解决
$npm i cors -S //安装cors跨域插件
在app.js文件中设置插件
const cors = require('cors')//引入cors插件
在路由接口前使用cors
app.use(cors({
"origin": "*",
"methods": "GET,HEAD,PUT,PATCH,POST,DELETE",
"preflightContinue": false,
"optionsSuccessStatus": 200
}))
app.use('/login',loginRouster)//原有的路由使用命令
5. 数据库操作
后端在接收到前端传递的用户信息后需要对数据库进行一系列的增删改查动作,在项目目录下需要为数据库操作建立一个新的database文件夹来达到功能上的分离
安装mongoose插件
$npm i mongoose -s
database文件夹下新建connect.js文件,该文件内容负责实现连接数据库功能
const mongoose = require('mongoose')//引入mongoose模块
const dbName = 'member'//设定数据库名称
const connect = {
init(){
mongoose.connect(`mongodb://127.0.0.1:27017/${dbName}`,error =>{
if ( error ) {
console.log (error)
} else {
console.log( '数据库连接成功' )
}
})
}
}
module.exports = connect;//导出含有数据库连接方法的对象
5.1 mongoose的数据库基本操作
mongoose存储数据可分为三个创建阶段:创建骨架Schema -> 创建模型Model -> 创建实体Entity
5.1.1 创建骨架Schema
Schema不仅定义了文档结构和使用性能,还可以有扩展插件、实例方法、静态方法、复合索引、文档生命周期钩子
为了实现功能分离,需要在database文件夹下新建Schema文件夹来存放骨架
const mongoose = require( 'mongoose' );//引入模块
//创建骨架模块
const nameSchema = new mongoose.Schema({//mongoose模块下新建数据骨架对象
//骨架内部为字段和字段类型,写法如下
dataName:dataType,//e.g.(password:String)
})
//导出骨架模块
module.exports = nameSchema;
为了方便管理多个骨架,将Schema文件统一引入到一个index文件中,index是每个文件夹的核心文件,通常将分散的功能引入index文件中,后续只需要调用index文件即可使用到所有的功能。
const nameSchema = require('./nameSchema.js')//引入骨架文件
module.exports = {
//index文件夹下以对象的形式统一存放所有的数据库骨架,
//在其他页面具体引用具体骨架只需要使用es6的解构赋值技术即可获得对应的数据库骨架
nameSchema
}
5.1.2 创建模型Model
database下新建index.js文件
const mongoose = require('mongoose');
// 1. 连接数据库
const connect = require('./connect.js');
connect.init();//调用连接数据库的方法
// 2. 创建数据骨架 Schema
//解构赋值活动骨架对象中具体的数据库模型骨架
const {memberSchema} = require('./schema');//路径地址中index文件可以省略
// 3. 创建模型 Model
const memberModel = mongoose.model('members', memberSchema);//mongoose模块下方法,第一个参数为模型名,第二个参数为选择使用哪一个骨架
// 4. 创建db自定义模块
const db = {
//db对象内部为操作数据库的方法,在其他页面调用db对象内部的不同方法即可实现对数据库的操作
add(){},
del(){},
modify(){},
query(){}
}
module.exports = db;//导出db对象
5.1.3 创建实体Entity和增删改查操作
const member = new memberModel();//创建实体
//实体下即可对数据库进行操作
//增加数据(根据骨架字段填写数据)
member.dataname = value;
member.save(function(err){//通过save方法增加数据,回调函数用于提示报错信息
if (err) {
console.log('保存失败');
return;
}
});
//删除数据
var id=”57e24521a755e1154039a403”; //需要获取删除数据的_id唯一值
//通过model下的findById方法,找到需要删除的文档,使用remove方法删除
member.findById(id,function(err,doc){
doc.remove()
};
//修改数据
var id=”57e24521a755e1154039a403”;
member.findById(id,function(err,doc){
doc.dataName = newDataValue;//新数据覆盖旧数据
doc.save();//save方法保存数据
};
//查询数据
member.find({},function(err,docs){//第一个参数为查询条件
console.log(docs);
});
6.前后端信息传递
在数据库操作后,后端需要传递信息响应给前端,让前端知道成功与否,并根据传递的信息进行不同的页面交互让用户得到信息。
但是在javascript中,所有对数据库的操作都会被加入任务队列中异步进行,所以有时候无法正常传递信息。
在上图中,由于访问数据库会异步进行,导致下方渲染命令会先于访问数据库执行,从而无法正常的获取到result的值。我们可以使用es7新方法 async/await实现异步操作转同步操作,方法是在函数前插入async,具体操作前插入await。
这样函数执行会等待数据库访问完成后再想下执行,所以可以正常取到result的值传递给前端,前端只需要利用ajax的回调函数去处理该数据即可完成前后端的交互任务。
转载:https://blog.csdn.net/sanbeisuk/article/details/101026104