Javascript 节点js上的简单服务器

Javascript 节点js上的简单服务器,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,大家好:)我的问题是response.vrite()不起作用 为什么? 还有一个问题。是否打开每个启动/升级页面 var http = require("http"); var Db = require ("mongodb").Db; var Server = require("mongodb").Server; function start () { 'use strict'; function onRequest (request, response) { 'use strict';

大家好:)我的问题是response.vrite()不起作用 为什么? 还有一个问题。是否打开每个启动/升级页面

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;

您正在调用
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
对象,因此最好在启动时打开它一次。

正如Johnny所说,您的调用响应.end()在异步功能之外。通常,除非您知道回调函数的父函数是如何工作的,否则决不能指望回调函数以阻塞方式实际执行。DB.open可能会在连接完成时运行回调,我们不知道需要多长时间。由于DB.Open是非阻塞的,所以节点随后在DB.Open对数据库的异步调用完成之前执行response.end。您可能想了解一下异步javascript

是否检查了控制台打印出的内容?@user1852858我很乐意,欢迎访问。如果回答了您的问题,请单击答案左侧的复选标记进行确认。