大家好:)我的问题是无法正常工作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;
答案 0 :(得分: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
对象,所以最好在启动时打开一次。
答案 1 :(得分:1)
就像Johnny所说的那样,你的异步功能之外的调用response.end()。作为一项规则,除非你知道他们的父函数是如何工作的,否则你永远不应该依赖实际以阻塞方式执行的回调。 DB.open可能在连接完成后运行该回调,我们不知道需要多长时间。由于DB.Open是非阻塞的,因此节点然后在DB.open对数据库的异步调用可能甚至完成之前执行response.end。您可能想要阅读异步javascript