在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(); }); }