我正在探索koajs,并认为我已经理解了发电机,但显然事实并非如此。
module.exports.request = function* request() {
'use strict';
try {
yield check;
yield send;
} catch (ValidationError) {
this.status = 400;
this.body = ValidationError.message;
}
};
function* check() {
expect(this.body.param).to.be.a('number');
}
function* send() {
this.body.token = '654afssd98sf';
}

这导致错误Cannot read property 'status' of undefined
,因此上下文丢失了。
以下代码段有效,但不是所需的行为,即使检查引发错误也会发出响应。
module.exports.request = function *request(){
'use strict';
try{
yield checkTransaction;
} catch(ValidationError){
this.status = 400;
this.body = ValidationError.message;
}
yield sendTransaction;
};

如果您对如何构建koa应用程序有建议,我很高兴因为有很多例子,但没有一个真正涵盖了koa建筑设计的最佳实践。
编辑:上下文:
var koa = require('koa');
var requestLogger = require('koa-logger');
var body = require('koa-body');
var route = require('koa-route');
var app = module.exports = koa();
var test = require('./controllers/test');
// Logger
if(app.env === 'development'){
app.use(requestLogger());
}
app.use(body());
app.use(function *setup(next){
this.type = 'application/json';
yield next;
});
app.use(route.post('/test', test.request));
app.use(route.put('/test', test.authenticate))
if (!module.parent) {
app.listen(3000);
console.log('listening on port 3000');
}
答案 0 :(得分:0)
在评论和思考之后,我确信你的错误让bin忘记添加生成器函数的下一个。
module.exports.request = function* request(next) {
'use strict';
try {
yield check;
yield send;
} catch (ValidationError) {
this.status = 400;
this.body = ValidationError.message;
}
};
function* check() {
expect(this.body.param).to.be.a('number');
}
function* send() {
this.body.token = '654afssd98sf';
}