当前位置: 首页 > 后端技术 > Node.js

koa2的await-async结合mongoose的使用

时间:2023-04-03 18:33:31 Node.js

koa2在koa1的基础上提供了更好的异步流程控制方案——await-async,await-async可以让异步逻辑用同步写法来实现,如下图示例:functiongetSyncTime(){returnnewPromise((resolve,reject)=>{try{letstartTime=newDate().getTime()setTimeout(()=>{letendTime=newDate().getTime()letdata=endTime-startTimeresolve(data)},500)}catch(err){reject(err)}})}asyncfunctiongetSyncData(){lettime=awaitgetSyncTime()让数据=`endTime-startTime=${time}`returndata}asyncfunctiongetData(){letdata=awaitgetSyncData()console.log(data)}getData()这个方案的关键词是await和async。需要注意的是,底层的await调用函数必须返回一个Promise对象,例如getSyncTime()必须返回一个Promise对象。下面介绍koa2和mongoose结合实现查询功能。varmongodb=require('../config.js');varSchema=mongodb.mongoose.Schema;/***schema**/vardepartmentSchema=newSchema({id:String,//部门编号name:String//姓名});/***schemao**/varemployeeSchema=newSchema({id:Number,//工号name:String,//姓名sex:Number,//性别age:Number,//年龄//dep_id:String//部dep:{type:Schema.Types.ObjectId,ref:'department'}});//Models的实例是文档。//文档有许多自己的内置实例方法。//我们也可以定义我们自己的自定义文档实例方法。//注意:方法必须在用mongoose.model()employeeSchema.methods.printInfo=function()编译之前添加到模式中{vargreeting=this.name;console.log("模式中定义的测试方法:"+greeting);}/***model**/varemployee=mongodb.mongoose.model("employee",employeeSchema);vardepartment=mongodb.mongoose.model('部门',departmentSchema);varemployeeDAO=function(){};//我们可以通过我们的员工模型访问所有员工文档。employeeDAO.prototype.findAll=asyncfunction(callback){letlist=awaitemployee.find({}).populate({path:'dep',select:{name:1}}).exec();返回列表}module.exports=newemployeeDAO();上面代码中定义了schema和model,并提供了一个数据库查询DAO对象。由于mongoosesave、query等异步操作返回的是Promise对象的结果,因此可以直接通过await方法调用mongooseAPI,如awaitemployee.find({}).populate({path:'dep',选择:{名称:1}}).exec();猫鼬API可以在这里找到。通过调用DAO实现查询功能:constRouter=require('koa-router')letemployee=require('./../models/employee.js');letemployeeList=newRouter()employeeList.get('/',async(ctx)=>{varresult=awaitemployee.findAll();awaitctx.render('list',{employeeList:result})})module.exports=employeeList;需要注意的是,由于DAO里面的findAll函数是通过await调用异步查询的,所以findAll函数需要用async关键字声明。这个demo的源码可以参考这里。Express结合mongoose的使用可以参考我之前的文章。