Node.js请求数据事件不会触发。 我究竟做错了什么?

看起来好像请求对象上的数据事件没有被触发,或者我无法正确连接它,以便从中获取任何东西。 我得到了最后的结果,所有的url都在工作。 我看过论坛和文档,当我看着我的代码,它似乎应该工作。 我正在使用节点版本0.10.12。

我是新的。 我正试图让一个简单的服务器进入节点。 我正在关注“节点入门书”。 这些代码大部分来自那里,只是一些非常小的修改。 我已经直接从书中尝试了代码。

这是我现在正在使用的代码。

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; if (process.argv[2] !== undefined && process.argv[2] !== null) { server.start(router.route, handle, process.argv[2]); } else { server.start(router.route, handle); } 

router.js

 route = function(handle, pathname, response, postData) { if (typeof handle[pathname] === "function") { handle[pathname](response, postData); } else { response.writeHead(404, {"Content-Type": "text/plain"}); response.end("404 Not found"); } } exports.route = route; 

server.js

 var http = require('http'); var url = require('url'); var portToUse = 8888; start = function(route, handle, port) { if (port !== undefined && port !== null && typeof parseInt(port) === 'number' && port > 1000 && port < 10000) { console.log('You passed in the port number %d.', port); portToUse = port; } http.createServer(function(request, response) { var postData = ''; var pathname = url.parse(request.url).pathname; console.log('Request for %s received.', pathname); route(handle, pathname, response); request.setEncoding('utf8'); // I have tried both .on and .addListener request.on('data', function(postDataChunk) { postData += postDataChunk; console.log('Received POST data chunk %s.', postData); }); request.on('end', function(postDataChunk) { console.log(postDataChunk); route(handle, pathname, response, postData); }); }).listen(portToUse); console.log('The server listening on %d.', portToUse); } exports.start = start; 

requestHandlers.js

 var exec = require('child_process').exec; start = function(response, postData) { var body = '<!doctype html>' + '<html lang="en">' + '<head>' + '<meta charset="UTF-8">' + '<title>Upload Server</title>' + '</head>' + '<body>' + '<form action="/upload">' + '<textarea name="text" id="text-area" cols="40" rows="20"></textarea>' + '<input type="submit" value="Submit text">' + '</form>' + '</body>' + '</html>'; response.writeHead(200, {"Content-Type": "text/html"}); response.end(body); } upload = function(response, postData) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('You\'ve sent: ' + postData); } exports.start = start; exports.upload = upload; 

提前致谢。

在呼叫route之前,您需要添加data侦听器。 原因是,在你的处理程序中,你正在调用response.end 。 当你这样做时,节点检查套接字是否有数据侦听器,如果没有,它将转储现有的请求数据,因为它认为不再需要。