6

私は最初のnode.js/express / mongooseアプリで作業していますが、node.jsの非同期メカニズムが原因で問題が発生しています。正しくやっていないようです...

Expressを使用して定義したテストルートは次のとおりです。

app.get('/test', function(req, res){
  var mod = mongoose.model('MyModel');
  mod.find({},function(err, records){
    records.forEach(function(record){
      console.log('Record found:' + record.id);
      // res.send('Thing retrieved:' + record.id);
    });
  });
});

http:// localhost / testを発行するときに、応答で「MyModel」タイプのレコードのリストを取得したいと思います。

上記のコードは正常に機能していますが、このリスト全体をクライアントに返す場合は機能しません(コメント付きのres.send行)。最初のレコードのみが返されます。

私はnode.jsに非常に慣れていないので、app.getの最初のコールバック関数内にいくつかのコールバック関数を埋め込むことが良い解決策であるかどうかはわかりません。リスト全体を返すにはどうすればよいですか?

何か案が ?

4

1 に答える 1

10

あなたがすべきことは次のとおりです。

mod.find({},function(err, records){
  res.writeHead(200, {'Content-Length': body.length});
  records.forEach(function(record){
    res.write('Thing retrieved:' + record.id);
  });
});

常にドキュメントも確認してください。

http://nodejs.org/docs/v0.3.8/api/http.html#response.write

エクスプレスを使用しているのを見逃しました。送信関数はエクスプレスの一部であり、ノードのserverResponseオブジェクトを拡張します(私の悪い点です)。

しかし、私の答えはまだ当てはまります。expressのsend関数はを使用してデータを送信するServerResponse.end()ため、ソケットが閉じられ、write関数を使用してネイティブ関数を使用してデータを送信できなくなります。

res.end()エクスプレス内の一部のアイテムが影響を受ける可能性があるため、リクエストが完全に完了したときに電話をかけることもできます

于 2011-04-09T22:26:29.000 に答える