失去环境(这)

时间:2015-06-01 15:01:23

标签: generator ecmascript-6 koa

我正在探索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');
}

1 个答案:

答案 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';
}

比较Koa Error Handling guide