0

私はnode.jsを初めて使用します(1時間未満)。

mongodb コレクションを読み取り、データをブラウザー ウィンドウに出力する単純な http サーバーを立ち上げようとしています。

これまでのところ、私は持っています:

var http = require ("http")
var mongodb = require('mongodb');

http.createServer(function(request, response) {
    var server = new mongodb.Server("127.0.0.1", 27107, {});
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write('Collection Data:<br>')
    new mongodb.Db('testdb', server, {}).open(function (error, client) {
      if (error) throw error;
      var collection = new mongodb.Collection(client, 'test_coll');
      collection.find({}, {limit:100}).each(function(err, doc) {
        if (doc != null) {
            console.dir(doc.text);
            response.write(doc.text)
        }
      });
      response.write("some stuff")
      response.end();
    });
}).listen(8080)

これにより、コレクション項目のテキストがコンソールに表示されますが、ブラウザー ウィンドウには表示されません。これは、応答オブジェクトが .each コールバックのスコープ内にないためだと思いますか? これを間違った方法で構成しましたか?

4

2 に答える 2

2

問題はresponse.end()、コールバックが実行される前に呼び出されていることです。

次のように、内部に移動する必要があります。

collection.find({}, {limit:100}).each(function(err, doc){
    if (doc != null) {
        console.dir(doc.text);
        response.write(doc.text)
    } else {
        // null signifies end of iterator
        response.write("some stuff");
        response.end();
    }
});
于 2012-07-23T17:03:54.560 に答える
0

res.end は、コールバック内の for ループの後に発生する必要があります。

client.collection('test_coll', function(err, testColl) {
  testColl.find({}).each(function(err, doc) {
    if (err) {
        // handle errors
    } else if (doc) {
        res.write(doc._id + ' ')
    } else { // If there's no doc then it's the end of the loop
        res.end()
    }
  })
})
于 2012-07-24T04:11:35.973 に答える