看看下面的http echo服务器示例:https://repl.it/repls/SlipperyQuickwittedEvent
const http = require('http')
const PORT = 6000
const server = http.createServer((req, res) => {
req.pipe(res)
})
server.listen(PORT)
server.on('listening', () => {
const req = http.request(
{
port: PORT
},
res => {
console.log(res.statusCode)
res.pipe(process.stdout)
res.on('end', () => {
server.close()
})
}
)
req.end('abc')
})
我希望它能在控制台上打印200
和abc
。而是打印400
,什么也不打印。
我想念什么?
答案 0 :(得分:1)
信不信由你,你的困惑似乎源于对HTTP GET
请求的基本误解。
似乎 http
内置的Node符合HTTP/1.1 spec, section 9.3,归结为GET
请求不应包含消息正文以及随其发送的任何内容GET
正文中的,应忽略。 (SO Source)
编辑:此行为为documented as an issue on the official GitHub repository for NodeJS。
在该线程中,注意到底层HTTP引擎仍将接受并解析与适当的GET
头相关联的HTTP Content-Length
请求。由于您尚未使用当前代码进行说明,因此服务器将发送400 Bad Request
响应代码,因为就服务器而言,它发送的请求正文和GET
请求一起没有Content-Length
标头实际上是格式错误的请求。
更改http.request
构造函数以发送带有Content-Length
请求的GET
标头,基础引擎将接受并解析请求的请求正文。
const http = require('http');
const PORT = 6000;
const server = http.createServer((req, res) => {
req.pipe(res);
});
server.on('clientError', (err, socket) => {
console.log(err);
socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});
server.listen(PORT);
const responseString = "abc";
server.on('listening', () => {
const req = http.request(
{
port: PORT,
headers: {
'Content-Length': responseString.length
}
},
res => {
console.log(res.statusCode);
res.pipe(process.stdout);
res.on('end', () => {
server.close();
});
}
);
req.end(responseString);
});
要解决您在调试过程中捕获此错误的意见,可以使用此处理程序(直接从文档中进行,只需进行最小的修改即可添加错误对象的控制台日志记录),以获取有关{{1 }}响应:
400 Bad Request
然后,控制台将围绕server.on('clientError', (err, socket) => {
console.log(err);
socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});
响应提供更多上下文:
node v9.7.1 linux / amd64
400
答案 1 :(得分:0)
request
的默认HTTP请求方法是GET。如果通过GET请求发送数据,则http服务器将返回400 Bad Request。
我想知道是否有一种方法可以通过调试来实现。我尝试挂钩'error'
上的server
事件以及所有req
和res
都没有成功。