2012-12-02 148 views
2

大家好:)我的问题是不工作response.vrite() 为什么? 还有另一个问题。将被称为db.open每个启动/升级页面?节点js上的简单服务器

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

您是否检查控制台正在打印什么? – Joseph

回答

2

你是你response.write之前调用response.end。移动电话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对象将在每个请求打开,这将是更好的启动时打开一次。

+0

是的,这是正确的 –

+0

Thanky你很配! –

+1

@ user1852858我的荣幸,欢迎来到SO。如果回答您的问题,请点击答案左侧的复选标记以确认。 – JohnnyHK

1

就像约翰尼说的,你的调用response.end()超出了你的异步功能。一般来说,除非你知道他们的父函数如何在隐藏方式下工作,否则你不应该依靠实际以阻塞方式执行的回调。 DB.open可能在连接完成后运行该回调,并且我们不知道需要多长时间。由于DB.Open是非阻塞的,节点会在DB.open对数据库的异步调用甚至完成之前执行response.end。您可能想阅读一些关于异步的javascript