1

Usersコレクション内のユーザーを読み取り、ユーザー名を出力する単純なマングーステストサーバーをセットアップしようとしています。クエリデータのres.writeをクライアント側に表示させることができないようです

var mongoose = require('mongoose');
var db = mongoose.createConnection('localhost', 'bugtraq');
var schema = mongoose.Schema({ username : 'string', email : 'string' });
var User = db.model('User', schema);

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});

    User.find().exec(function (err, users) {
        if(err) { res.write(err.message); }
        if(users) {
            users.forEach(function(u){
                console.log(u.username);
                return '<b>'+u.username+'</b>';
            });
        }
    });

    res.write('</body></html>');
    res.end();
}).listen(8124, "127.0.0.1");
console.log('Server running at http://127.0.0.1:8124/');

サーバー側の出力は

<html><head></head><body></body></html>

コンソール出力にユーザー名が表示されます

どんなポインタも歓迎します

4

1 に答える 1

3

2 つの問題があります。まず、mongoose クエリは非同期ですが、クエリが実際に発生する前に、コールバックの外で応答を終了しています (確認のためにコードを再インデントする必要がありました)。

動作させるには、 のコールバック関数内で応答を終了する必要がありますUser.find

第二に、あなたが思うように出力を収集していません。この行は間違っています:

return '<b>'+u.username+'</b>';

あなたはreturn発見の出力を薄い空気にしています。応答で返す場合は、キャプチャする必要があります。

まとめると、次のようになります。

User.find().exec(function (err, users) {
    if(err) { res.write(err.message); }
    if(users) {
        // here make a buffer to store the built output ...
        var output = [];
        users.forEach(function(u){
            // (you saw this console output because this loop is happening, it's
            // just happening after your response has been ended)
            console.log(u.username);

            // ... then in each iteration of the loop, push to the buffer
            output.push('<b>'+u.username+'</b>');
        });
    }

    // finally, finish the response in the `find` callback.
    res.end(output.join() + '</body></html>');
});
于 2012-11-17T21:37:40.717 に答える