共计 13010 个字符,预计需要花费 33 分钟才能阅读完成。
Mongoose 是什么?
简略一句话概括:Mongoose 是一套操作 MongoDB 数据库的接口。
开始
在应用 mongoose 之前,须要当时装置好 Node 环境和 MongoDB 数据库。
以上准备就绪咱们就能够了。
在 Express Koa Egg 中的应用
-
在 Express 中
首先初始化我的项目npm init // 初始化我的项目 npm i xxx --save// 装置各种依赖例如 express nodemon ...
目录如下
|-express | | -- db// 启动 mongodb 数据库的 dbpath 门路 | | --model// 数据库中表的模型 | | --node_modules | | --public// 公共资源 | | --route// 路由 | | --schema// 模式类型 | | --app.js// 入口文件 | | --package.json// 配置文件
装置 mongoose。
npm install mongoose// 装置 mongoose
在 package.json
{ "dependencies": { "body-parser": "^1.19.0", "connect-multiparty": "^2.2.0", "express": "^4.17.1", "formidable": "^1.2.2", "http-proxy-middleware": "^2.0.0", "mongoose": "^5.12.13", "multer": "^1.4.2", "multiparty": "^4.2.2", "nodemon": "^2.0.7", "xlsx": "^0.17.4" } }
在 app.js 中引入依赖
const express=require("express");// 引入 express const mongoose = require('mongoose');// 引入 mongoose const app=express(); const port=8080;// 端口号 mongoose.connect('mongodb://localhost:27017/Management',{useNewUrlParser:true,useUnifiedTopology:true},function(err){if(err){console.log('链接失败'); }else{console.log('链接胜利'); } });// 链接数据库名 Mangagement 端口号 27017,勾销数据库启动正告,app.listen(port,()=>{console.log(`Example app listening at http://localhost:${port}`) })
开启数据库
在装置 mongodb/bin 目录执行 cdm
执行如下指令$ mongod --dbpath="数据库门路" --port= 端口号
// 例如 $ D:\Mongodb\bin> mongod --dbpath="E:\myNode\Management\db" --port=27021
而后再 E:\myNode\Management 执行
nodemon app.js// 如果胜利控制台会打印 链接胜利 Example app listening at http://localhost:8080 // 阐明数据库链接胜利
链接胜利咱们能够对 MongoDB 数据库进行 CURD 操作
在 schema 文件夹下定义数据表模式类型
在 schema/user.jsconst mongoose=require('mongoose'); module.exports=new mongoose.Schema({ Mailbox:String, UserName:String, Password:String, Password01:String, Name:String, Phone:Number, ContactAddress:String, Passport:String, ID:Number, Company:String, TouristGuide:String, GoAbroad:String })
在 model 文件夹定义数据表模型
const mongoose=require('mongoose'); const userSchema=require('../schema/user.js') module.exports=mongoose.model('User',userSchema) // 定义数据表名为 User 然而 mongodb 中的数据表名是 Users
在 route 文件夹下定义路由
const express=require('express'); const multipart = require('connect-multiparty');// const XLSX=require("xlsx")// 读取 elsx 文件 const multipartMiddleware = multipart(); const router=express.Router(); const User=require('../model/user.js') let userData; router.use((req,res,next)=>{ UserData={ code:0, data:{}, message:"" } next();}) // 上传 excal 表 router.post('/uploadFile', multipartMiddleware, async function (req, res, next) {console.log("胜利") console.log(req.files.file.path) let excelData = []; // 用来保留 let reqData = []; const workbook = XLSX.readFile(req.files.file.path);// 读取文件 console.log(workbook) const sheetNames = workbook.SheetNames;//[sheet1] for (var sheet in workbook.Sheets) {console.log(sheet) if (workbook.Sheets.hasOwnProperty(sheet)) {fromTo = workbook.Sheets[sheet]['!ref']; console.log(workbook.Sheets[sheet]) console.log(fromTo) // 解析 excel 文件失去数据 excelData = excelData.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet])); } } //excel 表日期解决办法 function excelDateFN(DataStr){var y = new Date(1900, 0, DataStr) var d=new Date(y) var m=d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate() //+ '' + d.getHours() +':'+ d.getMinutes() +':' + d.getSeconds(); return m } console.log(excelData); for (var i = 0; i < excelData.length; i++) { reqData.push({id: excelData[i]['编号'], Name: excelData[i]['姓名'], Sex: excelData[i]['性别'], EName: excelData[i]['英文名'], Nationality: excelData[i]['国籍'], BirthPlace: excelData[i]['出生地点'], BirthDay: excelDateFN(excelData[i]['出生日期']), Passport: excelData[i]['护照号'], DateIssue: excelDateFN(excelData[i]['护照签发日期']), PeriodValidity: excelDateFN(excelData[i]['护照有效期']), PlaceIssue: excelData[i]['护照签发地'], Visa: excelData[i]['签证号码'], }) } // 数据处理完结调用 sql 语句,并且返回前台 console.log(reqData); if(reqData.length!=0){ UserData.code=1; UserData.message="上传胜利"; UserData.data=reqData res.send(UserData) }else{ UserData.code=1; UserData.message="上传失败"; UserData.data="" res.send(UserData) } //res.json(reqData) }) // 信息展现 router.post("/personalData",(req,res)=>{ const UserName=req.body.UserName User.findOne({UserName:UserName}).then((data)=>{if(data){ UserData.code=1; UserData.message="申请胜利"; UserData.data=data res.send(UserData) } }) }) // 批改信息 router.post("/revisePersonalData",(req,res)=>{console.log(req.body) const _id=req.body._id, UserName=req.body.UserName, Password=req.body.Password, Password01=req.body.Password01, Name=req.body.Name, Phone=req.body.Phone, ContactAddress=req.body.ContactAddress, Passport=req.body.Passport, ID=req.body.ID, Company=req.body.Company const updateFields = { _id, UserName, Password, Password01, Name, Phone, ContactAddress, Passport, ID, Company }; User.findByIdAndUpdate({_id:_id},updateFields,(err,data)=>{if(data){ UserData.code=1; UserData.message="批改胜利"; res.send(UserData) } }) }) // 注册 router.post('/logon',(req,res)=>{ const UserName=req.body.UserName const Password=req.body.Password const Password01=req.body.Password01 const Name=req.body.Name const Phone=req.body.Phone const ContactAddress=req.body.ContactAddress const Passport=req.body.Passport const ID=req.body.ID const Company=req.body.Company //console.log(req.body) User.findOne({UserName:UserName}).then(function(data){console.log(data) if(data){ UserData.code=3; UserData.message="用户名已存在"; res.send(UserData) }else{ let newUser=new User({ UserName:UserName, Password:Password, Password01:Password01, Name:Name, Phone:Phone, ContactAddress:ContactAddress, Passport:Passport, ID:ID, Company:Company, }) newUser.save() UserData.code=1; UserData.message="注册胜利"; res.send(UserData) } }) }) // 登录 router.post('/register',(req,res)=>{ let userName=req.body.userName; let password=req.body.passWord; console.log(req.body) User.find({UserName:userName,Password:password}).then((data)=>{console.log(data) if(data){console.log('登录胜利') UserData.code=1 UserData.message="登录胜利" res.send(UserData) }else{console.log('登录胜利') UserData.code=2 UserData.message="用户名不存在" res.send(UserData) } }) }) module.exports=router
在 app.js 中应用路由
app.use('/User',require('./route/user.js'))
接口:
注册:http://localhost:8080/User/login
登录:http://localhost:8080/User/re…
上传:http://localhost:8080/User/up…
查找:http://localhost:8080/User/pe…
批改:http://localhost:8080/User/re… -
在 Koa 中
首先初始化我的项目npm init // 初始化我的项目 npm i xxx --save// 装置各种依赖例如 koa nodemon ...
目录如下
|-koa | | -- db// 启动 mongodb 数据库的 dbpath 门路 | | --model// 数据库中表的模型 | | --node_modules | | --public// 公共资源 | | --route// 路由 | | --schema// 模式类型 | | --app.js// 入口文件 | | --package.json// 配置文件
装置 mongoose。
npm install mongoose// 装置 mongoose
在 package.json
{ "name": "vietnam", "version": "1.0.0", "description": "越南签证管理系统的接口我的项目", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\"&& exit 1", "start": "node app.js" }, "author": "栗路遥", "license": "ISC", "dependencies": { "@koa/multer": "^3.0.0", "koa": "^2.13.1", "koa-body": "^4.2.0", "koa-bodyparser": "^4.3.0", "koa-router": "^10.0.0", "koa-static": "^5.0.0", "koa2-cors": "^2.0.6", "mongodb": "^4.0.1", "mongoose": "^5.13.5", "multer": "^1.4.2", "path": "^0.12.7" }, "devDependencies": {}}
在 app.js 中引入依赖
const Koa=require('koa'); const cors = require('koa2-cors');// 跨域的包 const mongoose=require('mongoose'); const router=require('koa-router')()// 路由 const koaStatic=require('koa-static')// 动态 const koaBody=require('koa-body');// const multer = require('@koa/multer'); const bodyParser=require('koa-bodyparser')//post 申请 const path=require('path'); const app=new Koa(); var storage = multer.diskStorage({ // 文件保留门路 destination: function(req, file, cb) {cb(null,path.join(__dirname ,'/public/uploads')) }, // 批改文件名称 filename: function(req, file, cb) {let type = file.originalname.split('.')[1] cb(null, `${file.fieldname}-${Date.now().toString(16)}.${type}`) } }) // 加载配置 // var upload = multer({storage}); router.post('/upload',upload.single('File'), async(ctx, next) => {console.log(ctx.request) ctx.body = `${ctx.origin}/public/uploads/${ctx.file.filename}` }) let register=require('./routes/register.js') let vise=require('./routes/visa.js') let DataList=require('./routes/datalist.js') router.use(register.routes())// 登录接口 router.use(vise.routes())// 签证接口 router.use(DataList.routes()) app.use(cors())// 容许跨域 app.use(bodyParser())// 启用 bodyParser 解决 post 申请 app.use(router.routes())// 启用路由 app.use(router.allowedMethods()) mongoose.connect('mongodb://localhost:27018/VietNam',{useNewUrlParser:true,useUnifiedTopology:true},(err)=>{if(err){console.log('链接失败'); }else{console.log('链接胜利'); { // 创立新表 //const dataList=mongoose.model('数据表名',{"健名": 类型}) //const kitty = new dataList({"键名":"键值"}) //kitty.save().then(() => console.log('我是创立数据新表')); } }; })// 数据表名 VietNam 端口号 27018 勾销数据库启动正告 app.listen(3001,()=>{console.log('http://localhost:3001') });
开启数据库
在装置 mongodb/bin 目录执行 cdm
执行如下指令$ mongod --dbpath="数据库门路" --port= 端口号
// 例如 $ D:\Mongodb\bin> mongod --dbpath="E:\myNode\VietNam\db" --port=27018
而后再 E:\myNode\Management 执行
nodemon app.js// 如果胜利控制台会打印 链接胜利 http://localhost:3001 // 阐明数据库链接胜利
链接胜利咱们能够对 MongoDB 数据库进行 CURD 操作
在 schema 文件夹下定义数据表模式类型
在 schema/user.js// 和 express 应用办法一样 const mongoose=require('mongoose'); module.exports=new mongoose.Schema({ UserName:String, Password:String, })
在 model 文件夹定义数据表模型
// 和 express 应用办法一样 const mongoose=require('mongoose'); const userSchema=require('../schema/user.js') module.exports=mongoose.model('User',userSchema) // 定义数据表名为 User 然而 mongodb 中的数据表名是 Users
在 route 文件夹下定义路由
const Router=require('koa-router'); const router=new Router(); const Visa=require('../model/visa.js'); router.post('/visa',async (ctx,next)=>{console.log(ctx.request.body.ID) ctx.response.status=200 let VisaU= await Visa.find({"ID":ctx.request.body.ID}) const obj={detail:[] } let User=VisaU[0] console.log(User) if(User===undefined){ //obj.msg="该订单不存在" ctx.body=obj }else{ //obj.msg="查问胜利" obj.detail=User ctx.body=obj } //ctx.body=User }) module.exports=router
在 app.js 中应用路由
let vise=require('./routes/visa.js') router.use(vise.routes())// 签证接口
接口:
签证:http://localhost:8080/visa -
在 Egg 中
首先初始化我的项目$ mkdir project-name// 创立一个空的文件夹 $ npm init egg --type=simple//simple 示意骨架类型
目录如下:
|-app// 次要开发的文件 | |-- controller// 解析用户的输出,解决后返回相应的后果 | |-- db// 启动 mongodb 数据库的 dbpath 门路(可选)| |--extend// 框架的扩大(内置对象扩大) | | |---application.js//(固定名称)| | |---context.js//(固定名称)| | |---request.js//(固定名称)| | |---response.js//(固定名称)| | |---helper.js//(固定名称)| |--middleware// 编写中间件 | |--model// 数据库中表的模型 | |--publie// 动态资源 | |--schedule// 定时工作 | |--service// 编写业务逻辑层 | |--view// 模板文件 | |---router.js// 配置 URL 路由 |-config// 寄存配置文件 | |--config.default.js// 用于编写配置文件 | |--plugin.js// 配置须要加载的插件 |-test// 寄存单元测试 |-logs// 日志文件 |-package.json// 我的项目形容
下载 egg-mongoose
npm i egg-mongoose --save
配置 config/plugin.js
'use strict'; module.exports = { mongoose:{ enable:true, package:"egg-mongoose" } };
在 config/config.default.js
'use strict'; module.exports = appInfo => {const config = exports = {}; // use for cookie sign key, should change to your own and keep security config.keys = appInfo.name + '_1641975352438_173'; // add your middleware config here config.middleware = []; // add your user config here const userConfig = {// myAppName: 'egg',}; //mongoose 数据库配置 config.mongoose={ url:'mongodb://127.0.0.1:27021/VietNamVisa',// 端口号 27021 数据库名 VietNamVisa options:{useNewUrlParser:true,useUnifiedTopology:true},// 其余配置正告解除办法 } return { ...config, ...userConfig, }; };
开启数据库
关上电脑上的 mongodb 文件夹下的 bin 目录 cmd
执行 mongod –dbpath= 存储数据的门路 –port= 数据库的端口号
例如
mongod --dbpath=E:\myNode\VietNamVisa\init\app\db --port=27021
而后再 E:\myNode\VietNamVisa 执行
npm run dev// 启动我的项目
在 app/model/visaOnArrivalModel.js
创立一个模型
module.exports=app=>{const {mongoose}=app;
const {Schema}=mongoose;
const VisaOnArrivalSchema=new Schema({
// 订单号
OrderNumber:{type:String},
// 姓名
FullName:{type:String},
// 护照号
PassportNo:{type:String},
// 登程航班号
DepartureFlightNumber:{type:String},
// 入境工夫
TimeOfEntry:{type:String},
// 到达机场
ArriveAtTheAirport:{type:String},
// 航班号
FlightNumber:{type:String},
// 英文名
EnglishName:{type:String},
// 性别
Gender:{type:String},
// 出生日期
DateOfBirth:{type:String},
// 国籍
Nationality:{type:String},
// 护照签发日期
PassportIssueDate:{type:String},
// 护照有效期
PassportPeriodOfValidity:{type:String},
// 离境日期
DepartureDate:{type:String},
// 登程城市
DepartureCity:{type:String},
// 批文类型
Type:{type:String},
// 批文的状态
Status:{type:String},
//Checked:{type:Boolean}
});
return mongoose.model("VisaOnArrivalModel",VisaOnArrivalSchema,"visaonarrivals")
}
// 定义了一张名为 visaonarrivals 的数据表
在 app/service/visaOnArrivalService.js
写操作数据库的业务逻辑
"use strict"
const Service=require("egg").Service;
class VisaOnArrivalService extends Service {async VisaOnArrival(obj){const {ctx}=this;
// 存储数据
// 留神!!!!ctx.model.xxx 中 xxx 指的是 model 的文件名首字母大写
const VisaOnArrivalList = new ctx.model.VisaOnArrivalModel({
OrderNumber:obj.OrderNumber,
// 姓名
FullName:obj.FullName,
// 护照号
PassportNo:obj.PassportNo,
// 登程航班号
DepartureFlightNumber:obj.DepartureFlightNumber,
// 入境工夫
TimeOfEntry:obj.TimeOfEntry,
// 到达机场
ArriveAtTheAirport:obj.ArriveAtTheAirport,
// 航班号
FlightNumber:obj.,
// 英文名
EnglishName:obj.FlightNumber,
// 性别
Gender:obj.Gender,
// 出生日期
DateOfBirth:obj.DateOfBirth,
// 国籍
Nationality:obj.Nationality,
// 护照签发日期
PassportIssueDate:obj.PassportIssueDate,
// 护照有效期
PassportPeriodOfValidity:obj.PassportPeriodOfValidity,
// 离境日期
DepartureDate:obj.DepartureDate,
// 登程城市
DepartureCity:obj.DepartureCity,
// 类型
Type:obj.Type,
// 批文的状态
Status:obj.Status,
});
// 数据保留到数据库
VisaOnArrivalList.save();
return "增加胜利"
}
}
module.exports=VisaOnArrivalService;
在 app/controller/visaOnArrival.js
下编写对于解析用户的输出,解决后返回相应的后果
"use strict"
const Controller=require('egg').Controller;
class VisaOnArrival extends Controller {async VisaOnArrival(){const {ctx}=this
//const req=ctx.request.body
const res=await ctx.service.visaOnArrivalService.VisaOnArrival(req)
//console.log(res)
ctx.body={
state:200,
msg:res
}
}
}
module.exports=VisaOnArrival
在 app/router.js
编写路由
'use strict';
module.exports = app => {const { router, controller} = app;
// 增加数据
router.post("/AddVisaOnArrival",controller.visaOnArrival.VisaOnArrival);
};
总结
以上就是对于 Mongoose 在 Express、Koa、Egg 中应用比照,Mongoose 在 Express、Koa 的应用没有区别。在 Egg 中的应用相较与另外两个框架有较大的改变。最大的区别还是基于框架本身特点。前两个框架没有太多约定,写法比拟自在随性,齐全依据开发者本人的爱好编写。Egg 的特点约定优于配置。开发者书写就更加标准对立。