2013-07-13 242 views
1

我是NodeJS的新手。NodeJS console.log工作但response.write不

我正在閱讀this book以瞭解它。

我在其中一個請求處理程序模塊中使用以下代碼。 基本上,當我收到來自瀏覽器的請求時,我會發送一個調用該函數並獲取屏幕上顯示的窗口中「DIR」命令的內容。

的index.js文件是一個我作爲運行web應用程序

這是index.js

var server = require("./server.js"); 
var router = require("./router.js"); 
var requestHandlers = require("./requestHandlers"); 

var handle = {}; 
handle["/"] = requestHandlers.start; 
handle["/start"] = requestHandlers.start; 
handle["/upload"] = requestHandlers.upload; 

server.start(router.route, handle); 

這是server.js 服務器文件發送請求到路由器

var http = require("http"); 
var url = require("url"); 

function start(route, handle) 
{ 
function onRequest(request, response) 
{ 
    //console.log("Request recieved!"); 
    var pathname = url.parse(request.url).pathname; 
    console.log("Request for " + pathname + " has been recieved"); 
    response.writeHead(200, {"Content-Type": "text/plain"}); 

    route(handle, pathname, response); 

    response.end(); 
} 

http.createServer(onRequest).listen(8888); 

console.log("Server started!"); 

} 

exports.start = start; 

這是r outer.js 這是使用在index.js(用於將請求映射到它們各自的處理程序)中創建的句柄的路由器。

function route(handle, pathname, response) 
{ 
console.log("About to route the request " + pathname); 
if(typeof handle[pathname] == 'function') 
{ 
    handle[pathname](response); 
} 
else 
{ 
    console.log("No request handler found for " + pathname); 
    response.writeHead(404,{"Content Type": "text/plain"}); 
    response.write("404 not found"); 
    response.end(); 
} 
} 

exports.route = route; 

最後這是那裏的請求被處理,在requestHandlers.js 在這裏,它看起來像的console.log語句工作正常,但Response.Write語句沒有。

var exec = require("child_process").exec; 

function start(response) 
{ 
    console.log("Request handler 'start' was called."); 

    exec("dir", function(error, stdout, stderr) { 
     response.writeHead(200,{"Content Type": "text/plain"}); 
     response.write("Hello Upload!"); 
     response.write(stdout); 
     response.write("Hello!"); 
     console.log(stdout); 
     response.end(); 
    }); 
} 

function upload(response) 
{ 
console.log("Request handler 'upload' was called."); 
response.writeHead(200,{"Content Type": "text/plain"}); 
response.write("Hello Upload!"); 
response.end(); 
} 

exports.start = start; 
exports.upload = upload; 

任何幫助,將不勝感激

+2

我們需要A)一個完整的例子。上面的代碼片段看起來不錯,但我們需要看到整個圖片。和B)對該程序的行爲進行準確的技術性描述,而不是「不起作用」。它有什麼作用?你在期待什麼?有錯誤消息嗎? –

+1

+1發佈完整的代碼。告訴它目前正在做什麼以及它是什麼**應該做** – CuriousMind

+0

在那裏,我已根據要求進行了更改。 :) –

回答

2

我覺得你的請求被打破的原因是,它看起來像response.writeHead被稱爲兩次,一次在服務器#onRequest,一次在requestHandlers#上傳。

Node.js Docs - response.writeHead

一旦你感覺舒服些與節點我可能會建議拉任何響應寫入/結束碼出server.js的建立和實施,每個請求將通過各requestHandler通過中間件方法直到它匹配或結束。

希望有所幫助 - 開心點吧!

編輯:+1 Andreas的評論。不是上傳路徑上的問題,因爲這是全部同步的,但是在requestHandlers#中,一旦調用exec,控制流將繼續返回server.js,其中調用response.end()。

+0

感謝您的幫助!我剛剛評論了_server.js_中的'response.writeHead()'和'response.end()'部分 –

相關問題