NodeJs引发TypeError('第一个参数必须是string,数组或缓冲区');

我正在关注一个nodejs的在线书: http ://nodebeginner.org/,并且被困在其中一个部分。 在这一节(http://nodebeginner.org/#head22),它要求我创build以下4个文件:

**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); **requestHandlers.js**: function start(){ console.log("Request handler 'start' was called."); return "Hello start"; } function upload(){ console.log("Request handler 'upload' was called."); return "Hello Upload"; } exports.start = start; exports.upload = upload; **router.js**: function route(handle, pathname){ console.log("About to route a request for " + pathname); if(typeof handle[pathname] === 'function'){ handle[pathname](); }else{ console.log("No request handler found for " + pathname); return "404 Not found"; } } exports.route = route; **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."); response.writeHead(200, {"Content-Type":"text/plain"}); var content = route(handle, pathname); response.write(content); response.end(); } http.createServer(onRequest).listen(8888); console.log("Server has started."); } exports.start = start; 

当我运行时,它会返回以下错误:

服务器已经启动。 请求/收到。 关于路由/请求处理程序“开始”的请求被调用。

http2.js:598抛出新的TypeError('第一个参数必须是string,数组或缓冲区'); ^ TypeError:第一个参数必须是Server.onRequest(/var/www/node/server.js:11:12)ServerResponse.write(http2.js:598:11)上的string,数组或缓冲区。在Socket.ondata(http2.js:1347:22)的HTTPParser.onHeadersComplete(http2.js:108:31)处的HTTPParser.onIncoming(http2.js:1451:12)处发射(events.js:70:17) TCP.onread(net_uv.js:309:27)

我可以跟踪到server.js的错误,当我注释到这两行,它的工作原理:

  var content = route(handle, pathname); response.write(content); 

我在哪里做错了?

你忘了返回router.js的第四行的值

  handle[pathname](); 

如果您将其更改为:

  return handle[pathname]();