我是NodeJS的新手。
我正在阅读this book来学习它。
我在其中一个请求处理程序模块中使用以下代码。 基本上,当我从浏览器收到请求时,我会调用此函数并在屏幕上显示的窗口中获取“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 中创建的句柄的路由器(用于将请求映射到各自的处理程序)。
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;
非常感谢任何帮助
答案 0 :(得分:2)
我认为你的请求破解的原因是它看起来像response.writeHead被调用两次,一次在server#onRequest中,一次在requestHandlers #upload中。
Node.js Docs - response.writeHead
一旦你对Node感觉更舒服一点,我可能会建议从server.js中提取任何响应写入/结束代码并实现一个中间件方法,其中每个请求都通过每个requestHandler传递,直到匹配或得到到最后。
希望有所帮助 - 快乐的noding!
编辑:+1安德烈亚斯的评论。不是上传路由上的问题,因为这是同步的,但是在requestHandlers #start中,一旦调用了exec,控制流就会继续返回到调用response.end()的server.js。