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.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 = [];   //用来保留 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的特点约定优于配置。开发者书写就更加标准对立。