Node.js“写完后”的错误

从一个基本的节点应用程序开始,我不知道如何击败这个“写入结束”错误,即使在几个网站上build议的callback。

index.js:

var server = require("./server"); var router = require("./router"); 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) { var postData =""; var pathname = url.parse(request.url).pathname; console.log("Request for " + pathname + " received."); route(handle, pathname, response); } http.createServer(onRequest).listen(8888); console.log("Server has started."); } exports.start = start; 

router.js:

 function route(handle, pathname, response) { console.log("About to route a request for " + 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; and now the culprit, requestHandlers.js: function start(response) { console.log("Request handler 'start' was called."); var body = '<html>'+ '<head>'+ '<meta http-equiv="Content-Type" content="text/html; '+ 'charset=UTF-8" />'+ '</head>'+ '<body>'+ '<div>Hello Start</div>' + '</body>'+ '</html>'; response.writeHead(200, {"Content-Type": "text/html"}); response.write(body); 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; 

这里是堆栈跟踪:

C02RF8L7FVH5:HelloWorld francop $ node index.js服务器已启动。 请求/收到。 关于路由/请求处理程序“开始”的请求被调用。 关于路由/请求处理程序“开始”的请求被调用。 events.js:141扔呃; //未处理“错误”事件^

错误:在path(/用户名/密码)处的Object.start(/Users/francop/Documents/Apps/HelloWorld/requestHandlers.js:18:14)处的ServerResponse.OutgoingMessage.write(_http_outgoing.js:430:15) francop / Documents / Apps / HelloWorld / router.js:5:21)在IncomingMessage。 (/Users/francop/Documents/Apps/HelloWorld/server.js:19:6)atEventsMessage.emit(events.js:166:7)的emitNone(events.js:67:13)在endReadableNT(_stream_readable.js :921:12)在nextTickCallbackWith2Args(node.js:442:9)在process._tickCallback(node.js:356:17)

我在任何地方find的唯一答案是“这是asynchronous,所以使用callback”像这样:

 response.write(body, function(err) { response.end(); }); 

…哪个抛出完全相同的错误。

任何帮助,这将是惊人的。 我在网上find的几个稀疏的答案根本没有帮助。

谢谢!

返回你的身体在response.end()而不是response.write()

 function start (response) { console.log("Request handler 'start' was called."); var body = '<html>'+ '<head>'+ '<meta http-equiv="Content-Type" content="text/html; '+ 'charset=UTF-8" />'+ '</head>'+ '<body>'+ '<div>Hello Start</div>' + '</body>'+ '</html>'; response.writeHead(200, {"Content-Type": "text/html"}); response.end(body); } 

编辑1:

第一次调用response.write() ,它会将caching的头信息和第一个正文发送给客户端。 第二次调用response.write() ,Node.js假定你将要stream式传输数据,并分别发送。 也就是说,响应被缓冲到第一个主体。

因此,如果只想发送一个块,则必须使用response.end(body) ,如果要发送多个块,则必须在多个response.write()后用response.write()

示例单个块:

 function (chunk){ response.end(chunk); } 

示例多个块:

 function (chunkArray){ // loop on chunks for(var i=0; i < chunkArray.length; i++){ response.write(chunkArray[i]); } // end the response with empty params response.end(); }