2

大家好 :) 我的问题是 response.vrite() 不起作用,为什么?还有一个问题。每次启动/升级页面都会调用db.open吗?

var http = require("http");
var Db = require ("mongodb").Db;
var Server = require("mongodb").Server;
function start () {
'use strict';
function onRequest (request, response) {
    'use strict';
    var db = new Db ("TestApp", new Server ("127.0.0.1", 27017, {}));
    response.writeHead(200, {"Content-Type": "application/json", "Access-Control-Allow-Origin": "*"});
    db.open (function (err, db, response) {
        db.collection ('ObjectCollection', function (err, collection) {
            collection.find().toArray (function (err, docs) {
                console.log (docs);
                response.write(JSON.stringify(docs));
            });
        });
    });
    response.end();
}

http.createServer(onRequest).listen(8080);
console.log ('Server has started...')
}exports.start = start;
4

2 回答 2

2

response.end在你的response.write. response.end在回调中移动调用,如下所示:

var http = require("http");
var Db = require ("mongodb").Db;
var Server = require("mongodb").Server;
function start () {
'use strict';
function onRequest (request, response) {
    'use strict';
    var db = new Db ("TestApp", new Server ("127.0.0.1", 27017, {}));
    response.writeHead(200, {"Content-Type": "application/json", "Access-Control-Allow-Origin": "*"});
    db.open (function (err, db, response) {
        db.collection ('ObjectCollection', function (err, collection) {
            collection.find().toArray (function (err, docs) {
                console.log (docs);
                response.write(JSON.stringify(docs));
                response.end();
            });
        });
    });
}

http.createServer(onRequest).listen(8080);
console.log ('Server has started...')
}
exports.start = start;

是的,每个请求都会打开一个新Db对象,因此最好在启动期间打开一次。

于 2012-12-02T05:31:49.033 回答
1

就像约翰尼说的那样,您在异步功能之外调用 response.end() 。通常,除非您知道它们的父函数在后台是如何工作的,否则您永远不应该指望以阻塞方式实际执行的回调。DB.open 可能会在连接完成时运行该回调,我们不知道这需要多长时间。由于 DB.Open 是非阻塞的,因此节点会在 DB.open 对数据库的异步调用甚至可能完成之前执行 response.end。您可能需要阅读一些关于异步 javascript 的内容

于 2012-12-02T05:46:21.757 回答