koa2 有类似于最佳实践的东西吗? 一种说法是使用 generator,另一种说法是使用 co。 希望有使用的同学可以帮忙解惑,谢谢了!(我使用的Node v6)
推荐的是使用 async/await, 当然你要介意使用 babel, 使用 co.wrap 跟一个 async function 一致, 也是可以的。 详见 https://cnodejs.org/topic/5709cb2f94b38dcb3c09a7ac (这篇应在想用 async/await 但是不想在服务端使用 babel 的情况下阅读)
co是基于generator,实现了异步处理同步化,比如:
co(function *() {
let user = yield db.getUser();
user.name = 'ron';
yield user.save();
});
Koa1.0内嵌了co,是我们写action的时候不用麻烦的还要用co,比如:
let app = require('koa');
let router = require('koa-reouter');
router.get('/profiles', function *() {
this.body = yield db.getProfiles();
});
app.use(router.routes());
Koa 2.0,使用async/await 取代了generator/yield,比如:
let app = require('koa');
let router = require('koa-reouter');
router.get('/profiles', async ctx => {
ctx.body = await db.getProfiles();
});
app.use(router.routes());
async/await 是ES7的标准,现在node.js应该还没有build-in,而TJ不建议在服务端(node.js)中使用transform,所以现在koa2.0还是alpha版本,但是实际上koa2.0已经没有问题,可以用于production,参见:https://github.com/koajs/koa/issues/533。
现在要在nodejs中用koa2.0,必须用babel-node来transform,而transform后其实就是generator/yield,但以后等V8和nodejs内置了async/await后,就和generator/yield完全不一样了。