我正在尝试设置一个简单的mongoose测试服务器,该服务器读取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>
我确实在控制台输出中看到了用户名
欢迎任何指示
答案 0 :(得分:3)
你有两个问题。首先,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>');
});