Node.js HTTP回显服务器返回400

时间:2018-10-16 01:34:18

标签: node.js http

看看下面的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')
})

我希望它能在控制台上打印200abc。而是打印400,什么也不打印。

我想念什么?

2 个答案:

答案 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);
});

Repl.it fork


要解决您在调试过程中捕获此错误的意见,可以使用此处理程序(直接从文档中进行,只需进行最小的修改即可添加错误对象的控制台日志记录),以获取有关{{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事件以及所有reqres都没有成功。