Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js请求数据事件未触发。我做错了什么?_Javascript_Node.js_Events_Request - Fatal编程技术网

Javascript Node.js请求数据事件未触发。我做错了什么?

Javascript Node.js请求数据事件未触发。我做错了什么?,javascript,node.js,events,request,Javascript,Node.js,Events,Request,请求对象上的数据事件似乎没有触发,或者我无法正确连接它以从中获取任何信息。我很好地完成了结束事件,所有的URL都正常工作。我看过论坛和文档,当我看我的代码时,它似乎应该工作。我使用的是节点版本0.10.12 我是新来的。我试图让一个简单的服务器进入节点。我在学习Node入门书。这段代码的大部分都来自那里,只做了一些非常小的修改。我已经直接尝试了书中的代码 这是我现在正在使用的代码 index.js var server = require("./server"); var router = re

请求对象上的数据事件似乎没有触发,或者我无法正确连接它以从中获取任何信息。我很好地完成了结束事件,所有的URL都正常工作。我看过论坛和文档,当我看我的代码时,它似乎应该工作。我使用的是节点版本0.10.12

我是新来的。我试图让一个简单的服务器进入节点。我在学习Node入门书。这段代码的大部分都来自那里,只做了一些非常小的修改。我已经直接尝试了书中的代码

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

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);
}
路由器.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;
var http=require('http');
var url=require('url');
var-portouse=8888;
开始=功能(路由、句柄、端口){
如果(端口!==未定义和端口!==空和类型的parseInt(端口)==='number'&&port>1000和&port<10000){
console.log('您传入了端口号%d',端口号);
Portouse=端口;
}
createServer(函数(请求、响应){
var postData='';
var pathname=url.parse(request.url).pathname;
console.log('接收到对%s的请求',路径名);
路由(句柄、路径名、响应);
setEncoding('utf8');
//我已经尝试了.on和.addListener
请求.on('data',函数(postDataChunk){
postData+=postDataChunk;
console.log('接收到的POST数据块%s',postData);
});
request.on('end',函数(postDataChunk){
log(postDataChunk);
路由(句柄、路径名、响应、postData);
});
}).听(portouse);
console.log('在%d.上侦听的服务器,端口号);
}
exports.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;
var exec=require('child_process')。exec;
开始=功能(响应、postData){
变量体=“”+
'' + 
'' + 
'' + 
“上载服务器”+
'' + 
'' + 
'' + 
'' + 
'' + 
'' + 
'' + 
'';
writeHead(200,{“内容类型”:“text/html”});
答复.结束(正文);
}
上传=功能(响应、postData){
writeHead(200,{'Content-Type':'text/plain'});
response.end('您已发送:'+postData);
}
exports.start=开始;
exports.upload=上传;

提前感谢。

在调用
路由之前,您需要添加
数据
侦听器。原因是,在处理程序中,您正在调用
response.end
。执行此操作时,节点会检查套接字上是否有任何数据侦听器,如果没有,则会转储现有的请求数据,因为它认为不再需要这些数据。

谢谢。这改善了情况,你是正确的。现在,在router中的upload函数中,postData对象的行为就像一个字符串,直到我尝试写入它(例如response.write(postData)),或对它执行任何操作(例如postData.toString()),此时它被视为未定义。我可以在这一点之前对其进行控制台日志记录,并查看它是一个字符串,并且具有发布的数据。有什么想法吗?我想知道你如何解决同样的问题?我不会跟踪如何调用此侦听器