0

RESTful Web サービスを構築するために koa と knex を試しています。knex をジェネレーターにラップするkoa-knex-middlewareも使用しています。

特定のリソースに対する 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 を返し、DB スキーマに適合しない不正な形式のリクエストに対して 400 を返したいとします。

tap()knex からandを使ってみcatch()ましたが、ステータスコードを変更できませんでした。

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

永遠にハングアップします。.catch400 を設定するために使用しようとしても同じです。

最初は Koa を読んで、それがどのように機能するのかを大まかに理解したと思っていましたが、今ではもうよくわかりません。特に、koa とジェネレーターの相互作用と knex からの約束は、私をひどく混乱させます。

私の一般的なアプローチは健全ですか、それともこのように knex と koa を混合するのは悪い考えですか? また、この組み合わせでエラーとステータス コードを正確に処理するにはどうすればよいでしょうか。

4

1 に答える 1

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;
        }

    });
于 2015-11-01T17:35:34.170 に答える