2012-12-02 179 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