1

我正在尝试设置一个简单的猫鼬测试服​​务器来读取用户集合中的用户并打印用户名。我似乎无法让查询数据的 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

你有两个问题。首先,猫鼬查询是异步的,但是您在查询实际发生之前在它的回调之外结束您的响应(我必须重新缩进代码以确保)。

要使其工作,您需要在回调函数中结束响应User.find

其次,你没有像你想象的那样收集输出。这一行是错误的:

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

您正在return将 find 的输出变成稀薄的空气。如果您想在响应中返回它,您需要捕获它。

放在一起,它可能看起来像这样:

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 回答