2015-11-01 56 views
0

我正在试验koa和knex来构建一个RESTful的Web服务,虽然我有基本的工作,我坚持在处理错误。我也使用koa-knex-middleware将knex包装在一个生成器中。koa错误处理和状态代码与koa

我有下面的代码,它定义了特定资源GET和POST请求会发生什么:

var koa = require('koa'); 
var koaBody = require('koa-body')(); 
var router = require('koa-router')(); 
var app = koa(); 

var knex = require('./koa-knex'); 

app.use(knex({ 
    client: 'sqlite3', 
    connection: { 
     filename: "./src/server/devdb.sqlite" 
    } 
})); 

router 
    .get('/equipment', function *(next){ 
     this.body = yield this.knex('equipment'); 
    }) 
    .post('/equipment', koaBody, function *(next){ 
     this.body = yield this.knex('equipment').insert(this.request.body) 
    }); 

app.use(router.routes()).use(router.allowedMethods()); 

app.listen(4000); 

这工作一般,但我不能设法做的是改变HTTP状态码。例如,我想为POST请求返回201,以便为不符合数据库模式的畸形请求添加项目以及400。

我试着用knex的tap()catch(),但我无法修改状态码。

this.body = yield this.knex('equipment').insert(this.request.body).tap(function(){this.response = 204}.bind(this)) 

只是永远挂起。如果我尝试使用.catch来设置一个400,那也是一样的。

读到Koa起初我以为我大致了解它应该如何工作,但现在我不再那么肯定了。特别是koa与发电机的互动和knex的承诺让我非常困惑。

是我的一般方法,还是混合knex和koa这种方式是一个坏主意?我该如何处理这种组合的错误和状态码?

回答

0

您应该可以使用标准的try{}catch(err){}块。

https://github.com/tj/co#examples

vrouter 
    .get('/equipment', function *(next){ 
     this.body = yield this.knex('equipment'); 
    }) 
    .post('/equipment', koaBody, function *(next){ 
     try{ 
      this.body = yield this.knex('equipment').insert(this.request.body) 
      this.status = 201; 
     } 
     catch(err){ 
      this.throw(400, 'malformed request...'); 
      // or 
      // this.status = 400; 
     } 

    });