从node.js';s http.IncomingMessage
我正在尝试为node.js中编写的应用程序实现一个简单的HTTP端点。我已经创建了HTTP服务器,但现在我只能阅读请求内容体:从node.js';s http.IncomingMessage,node.js,httprequest,httpserver,Node.js,Httprequest,Httpserver,我正在尝试为node.js中编写的应用程序实现一个简单的HTTP端点。我已经创建了HTTP服务器,但现在我只能阅读请求内容体: http.createServer(function(r, s) { console.log(r.method, r.url, r.headers); console.log(r.read()); s.write("OK"); s.end(); }).listen(42646); 请求的方法、URL和标题打印正确,但r.read()
http.createServer(function(r, s) {
console.log(r.method, r.url, r.headers);
console.log(r.read());
s.write("OK");
s.end();
}).listen(42646);
请求的方法、URL和标题打印正确,但r.read()
始终为空。我可以说,请求的发出方式没有问题,因为content length
头在服务器端大于零
r
是一个实现可读流接口的http.IncomingMessage
对象,为什么它不工作?好的,我想我找到了解决方案。r
流(与node.js中的其他内容一样,愚蠢的我…)应该以异步事件驱动的方式读取:
http.createServer(function(r, s) {
console.log(r.method, r.url, r.headers);
var body = "";
r.on('readable', function() {
body += r.read();
});
r.on('end', function() {
console.log(body);
s.write("OK");
s.end();
});
}).listen(42646);
“readable”事件错误,它错误地在正文字符串的末尾添加了一个额外的空字符 使用“数据”事件处理具有块的流:
http.createServer((r, s) => {
console.log(r.method, r.url, r.headers);
let body = '';
r.on('data', (chunk) => {
body += chunk;
});
r.on('end', () => {
console.log(body);
s.write('OK');
s.end();
});
}).listen(42646);
它不仅是一种异步方法,而且是事件驱动的。您可以有效地使用函数,并且可以将它们作为一级函数传递,还可以使用闭包(匿名函数),这一事实使此方法成为javascript中最重要的编程方法。无论如何,我更喜欢
r.on(“data”,function(chunk))
可以直接处理读取的数据。与可读
相反,数据
表示已从流中读取某些内容,而不是可以读取某些内容。无论如何,这是io的首选方式。@BigMan73是正确的-这将在正文字符串的末尾添加一个null。请看他的答案,这应该是正确的答案。