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");//引入expressconst mongoose = require('mongoose');//引入mongooseconst 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 securityconfig.keys = appInfo.name + '_1641975352438_173';// add your middleware config hereconfig.middleware = [];// add your user config hereconst 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的特点约定优于配置。开发者书写就更加标准对立。