在Node.js上响应请求处理程序的非阻塞操作

我正在用Node Beginner Book学习Node.js。 当我试图用非阻塞操作来pipe理请求时,我被困住了。

如果我去本地主机:8888它返回的文件列表,但如果我去本地主机:8888 /开始或/上传它返回404找不到。 为什么?

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

requestHandlers.js

 var exec = require("child_process").exec; function start(response) { console.log("Request handler 'start' was called."); exec("ls -lah", function (error, stdout, stderr) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write(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; 

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; 

它是你的index.js中的处理键,它们应该是:

 handle["/"] = requestHandlers.start; handle["/start"] = requestHandlers.start; handle["/upload"] = requestHandlers.upload; 

我已经testing过,这绝对是问题

处理器键不应该以“/”开头吗?

response作为参数添加到exec调用中,如下所示:

 function start(response) { console.log("Request handler 'start' was called."); exec("ls -lah", response, function (error, stdout, stderr) { // ^^^^^^^^ response.writeHead(200, {"Content-Type": "text/plain"}); response.write(stdout); response.end(); }); }