NodeJS console.log工作,但response.write不

我是NodeJS的新手。

我正在读这本书来学习它。

我在其中一个请求处理程序模块中使用下面的代码。 基本上,当我收到来自浏览器的请求时,我发送一个调用这个函数,并获取屏幕上显示的窗口中的“DIR”命令的内容。

index.js文件是我作为webapp运行的文件

这是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; 

这是router.js这是使用index.js中创build的句柄 (用于将请求映射到各自的处理程序)的路由器。

 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; 

任何帮助将不胜感激

我想你的请求破坏的原因是它看起来像response.writeHead被调用两次,一次在服务器#onRequest和一次在requestHandlers#上传。

Node.js Docs – response.writeHead

一旦你对Node感觉更舒适一些,我可能会build议从server.js中提取任何写/结束代码的响应,并实现一个中间件的方法,每个请求通过每个requestHandler,直到它匹配或者到达结尾。

希望有所帮助 – 快乐的编程!

编辑:+1 Andreas的评论。 不是上传路由上的问题,因为这是全部同步的,但是在requestHandlers#中,一旦调用exec,控制stream将继续返回到调用response.end()的server.js。