【问题标题】:node.js - post response is not waiting for callback to completenode.js - 发布响应不等待回调完成
【发布时间】:2015-01-29 11:00:27
【问题描述】:

我正在开发 node.js http 服务器。服务器连接到 mongodb。我正在向服务器请求发布请求以从 mongodb 获取文档。但是 post 响应不等待 mongodb 回调完成。因此,我没有在客户端获得所需的输出。如何处理?

http.createServer(function(request, response) {
    if(request.method == "POST") { 
        var body = '';
        request.on('data', function(chunk) {
            console.log(chunk.toString());
            body += chunk;
        });
        request.on('end', function() {
            MongoClient.connect("mongodb://localhost:27017/exampleDb", function(err, db) {
                if(err) {
                    console.log("We are not connected");
                }   
                else {
                    var sysInfo = db.collection('sysInfo');
                    var jsonObj = sysInfo.find().toArray();
                    response.writeHead(200, {'Content-Type': 'text/plain'});
                    response.end(jsonObj);
                }
            });
        })
    }
});

【问题讨论】:

  • 您是否收到错误消息?我问是因为猫鼬connect 方法回调只收到一个error 参数。所以,当你执行db.collection('sysInfo') 时,你应该得到一个错误(db is undefined)。
  • 没有。我没有收到任何错误。但在代码到达 response.end(jsonObj) 之前,客户端会收到以当前 html 页面为内容的 post 响应。
  • 知道了。 @JohnnyHK 提供的答案是完美的。我只是对您问题中的mongoose 标签感到困惑,所以我认为您正试图通过mongoose 直接连接。但后来我意识到您使用的是 mongodb 原生驱动程序。

标签: javascript node.js mongodb callback


【解决方案1】:

toArray 是异步的,因此它通过回调而不是返回结果来提供结果。

所以那部分应该是:

sysInfo.find().toArray(function(err, docs) {
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end(docs);
});

【讨论】:

  • 这没有帮助。原因是 request.on( 'end' ... 不是在等待 MongoClient.connect 回调完成。所以问题是MongoClient.connect回调。
  • 或者response.end(docs)request.on( 'end' ...向客户端返回数据(当前html页面)后触发。
  • 真的很抱歉。问题解决了。问题的根源是不同的。我提供的信息不完整。感谢您的帮助。
猜你喜欢
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 2020-07-12
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
相关资源
最近更新 更多