koa-generator
项目使用 koa-generator 创建,git地址
安装
npm install -g koa-generator
创建项目
$ koa /tmp/foo & cd /tmp/foo
安装依赖
$ npm install
运行
$ npm start
通用
要捕获所有的 error,可以在加载 global middlewares之前添加捕获代码。
其中 err.status,这个可以在抛出错误的时候先新建 Error 对象,然后指定一下 status 即可。
app.use(function* (next) {
var start = new Date;
try {
yield next;
} catch (err) {
this.set('connection', 'close');
this.status = err.status || 500;
this.body = { 'success': false, 'message': err.message };
//这里触发最后的app.on('error'...
this.app.emit('error', err, this);
}
var ms = new Date - start;
console.log('%s %s - %s', this.method, this.url, ms);
});
// global middlewares
因为是 webapi 项目,最后输出的 json 格式要统一,可以在加载 global middlewares 之后添加格式化代码。this.returnMessage 直接加到 this 上的。
// global middlewares
...
app.use(function* (next) {
yield next;
if (!this.body) {
var err = new Error('can not find the resource');
err.status = 404;
throw err;
}
this.body = { 'success': true, 'data': this.body, 'message': this.returnMessage || '' };
});
koa-router
mu 请求要验证密码,是通过 querystring 参数 mupass 提供的,可以自己写一个验证用的 middleware。
var muAuth = function* (next) {
if (this.query.mupass && this.query.mupass === config.muPass) {
yield next;
} else {
var err = new Error('mu auth failed!');
err.status = 401;
throw err;
}
};
然后在 router 里直接使用即可
koa.use('/mu', muAuth, mu.routes(), mu.allowedMethods());
可以使用 router.param 方法过滤参数
router.param('id', function* (nodeId, next) {
if (nodeId === '1') {
yield next;
} else {
var err = new Error('server node not exist');
err.status = 404;
throw err;
}
});