2017-02-08 9 views
0

RESTサービスを管理するための最小限のサーバーをコーディングしました。コード化された唯一のルートは、mongoからデータを取り出し、それをクライアントに送信することになっています。コードは以下のとおりです。私はそれに到達しようとするとヘッダーがKoaで送信された後にヘッダーを削除できません

var kr = require('koa-route'); 
var koa = require('koa'); 
var app = koa(); 

var MongoClient = require("mongodb").MongoClient; 

var events = function *() 
{ 
    var _this = this; 

    MongoClient.connect("mongodb://localhost/eventdata", function(error, db) { 
     if (error) throw(error); 
     console.log("Connecté à la base de données"); 

     db.collection('events').find().toArray(function(err, array) 
     { 
      console.log('returning %d objects', array.length); 
      db.close(); 
      _this.body = {eventsArray : array}; 

     }); 
    }); 
} 

app.use(kr.get('/events', events)); 

app.listen(3000); 

興亜は、バージョン1.2.4

ですが、私はエラーメッセージが「それらが送られた後、ヘッダを削除することはできません」を取得します。 find()の前に応答を返すようにプログラム(sort of)が終了したことを理解しました。したがって、_this.body = {...}が呼び出されると、エラーが発生します。

今問題を解決するにはどうすればよいですか? 私はちょうどKoaを練習し始めたので、慣れていないものがたくさんあります。

私がここで提案したソリューションをテストしました:Can't remove headers after they are sentしかし、動作しません。あなたの助けを事前に

eventsArray = yield db.collection('events').find({}) 
        ^^ 
SyntaxError : unexpected identifier 

ありがとう:私は、次のエラーメッセージが表示されます。

答えて

2

あなたが約束するためにdb reqをラップする必要があるようです。

var kr = require('koa-route'); 
 
var koa = require('koa'); 
 
var app = koa(); 
 

 
var MongoClient = require("mongodb").MongoClient; 
 
var eventsPromise = function(){ 
 
    return new Promise(function(resolve, reject){ 
 
     MongoClient.connect("mongodb://localhost/eventdata", function(error, db) { 
 
     if (error){ 
 
      return reject(error); 
 
     } 
 
     console.log("Connecté à la base de données"); 
 

 
     db.collection('events').find().toArray(function(err, array) 
 
     { 
 
      console.log('returning %d objects', array.length); 
 
      db.close(); 
 
      return reslove({eventsArray : array}); 
 
     }); 
 
    }); 
 
    }); 
 
} 
 
var events = function *() 
 
{ 
 
    var event = yiled eventsPromise(); 
 
    this.body = event; 
 
} 
 

 
app.use(kr.get('/events', events)); 
 

 
app.listen(3000);

+0

印象的なこの方法で試してみてください!少し説明していただけますか?私は "収率"の概念を完全に理解していなかったと思います... – MrFlo

+0

助けてくれてうれしいです。 Koa - ミドルウェアとしてジェネレータ機能を使用しています。 (ジェネレータについてはhttps://davidwalsh.name/es6-generatorsを参照してください) ジェイルはジェネレータ機能の一時停止のようです。私たちは約束の結果を待っていて、次に行く。 –

+0

ほとんどすべて。どうもありがとう !! – MrFlo

関連する問題