koa2 在koa1 基础上提供了一种更好的异步流程控制方案--await-async,await-async能够让异步逻辑用同步写法实现,以下面的例子:html
function getSyncTime() { return new Promise((resolve, reject) => { try { let startTime = new Date().getTime() setTimeout(() => { let endTime = new Date().getTime() let data = endTime - startTime resolve( data ) }, 500) } catch ( err ) { reject( err ) } }) } async function getSyncData() { let time = await getSyncTime() let data = `endTime - startTime = ${time}` return data } async function getData() { let data = await getSyncData() console.log( data ) } getData()
该方案的关键词是 await 和 async,须要注意的是 最底层的 await 调用函数必须返回一个Promise对象,例如get SyncTime() 必须返回一个Promise对象。git
下面介绍 koa2 与 mongoose 的结合,实现查询功能。github
var mongodb = require('../config.js'); var Schema = mongodb.mongoose.Schema; /** * schema **/ var departmentSchema = new Schema({ id: String, //部门编号 name: String //名称 }); /** * schemao **/ var employeeSchema = new Schema({ id: Number, //工号 name: String, //姓名 sex: Number, //性别 age: Number, //年龄 // dep_id: String //部门 dep: { type: Schema.Types.ObjectId, ref: 'department' } }); // Instances of Models are documents. // Documents have many of their own built-in instance methods. // We may also define our own custom document instance methods too. // NOTE: methods must be added to the schema before compiling it with mongoose.model() employeeSchema.methods.printInfo = function() { var greeting = this.name; console.log("Testing methods defined in schema:" + greeting); } /** * model **/ var employee = mongodb.mongoose.model("employee", employeeSchema); var department = mongodb.mongoose.model('department', departmentSchema); var employeeDAO = function() {}; //We can access all of the employee documents through our employee model. employeeDAO.prototype.findAll = async function(callback) { let list = await employee.find({}).populate({ path: 'dep', select: { name: 1 } }).exec(); return list } module.exports = new employeeDAO();
在上述代码中,定义了schema、model,并提供了一个数据库查询 DAO 对象。因为 mongoose 的保存、查询等异步操做返回的是Promise对象结果,因此直接能够经过 await 方法调用 mongooseAPI,如mongodb
await employee.find({}).populate({ path: 'dep', select: { name: 1 } }).exec();
mongoose API 可参考这里。数据库
下面经过调用DAO实现查询功能:segmentfault
const Router = require('koa-router') let employee = require('./../models/employee.js'); let employeeList = new Router() employeeList.get('/', async(ctx) => { var result = await employee.findAll(); await ctx.render('list', { employeeList: result }) }) module.exports = employeeList;
须要注意的是,因为 DAO 中的 findAll 函数内部经过 await 调用了一个异步查询,因此 findAll 函数须要用 async 关键词声明。promise
本demo源码可参考这里koa
Express 结合 mongoose 的使用请参考我以前的文章。异步