Mongoose在Express、Koa、 Egg中使用对比

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.js
    const 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 = https://www.it610.com/article/[]; //用来保存 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 = https://www.it610.com/article/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=https://www.it610.com/article/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.UserNameUser.findOne({UserName:UserName}).then((data)=>{ if(data){ UserData.code=1; UserData.message="请求成功"; UserData.data=https://www.it610.com/article/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中使用对比,Mongoose在Express、Koa的使用没有区别。在 Egg中的使用相较与另外两个框架有较大的改动。最大的区别还是基于框架自身特点。前两个框架没有太多约定,写法比较自由随性,完全根据开发者自己的喜好编写。Egg的特点约定优于配置。开发者书写就更加规范统一。

    推荐阅读