首页 > 解决方案 > Node.js http 回显服务器返回 400

问题描述

看看下面的 http 回显服务器示例: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,没有别的。

我错过了什么?

标签: node.jshttp

解决方案


信不信由你,您的困惑似乎源于对 HTTPGET请求的根本误解。

似乎 Node 的内置http符合HTTP/1.1 规范,第 9.3 节归结为GET请求不应包含消息正文,并且在所述GET请求正文中发送的任何内容都应该被忽略。(所以来源

编辑:此行为已在NodeJS 的官方 GitHub 存储库中记录为问题

在该线程中,注意到底层 HTTP 引擎仍将接受并解析GET具有Content-Length相关标头的 HTTP 请求。由于您尚未使用当前代码考虑这一点,因此服务器将发送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 分叉


要解决有关在调试期间捕获此问题的评论,您可以使用此处理程序(直接来自文档,只需进行最少的修改即可添加错误对象的控制台日志记录)来获取有关响应背后原因的更多信息400 Bad Request

server.on('clientError', (err, socket) => {
  console.log(err);
  socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});

400然后,控制台将围绕响应提供更多上下文:

节点 v9.7.1 linux/amd64

{ Error: Parse Error
  bytesParsed: 59,
  code: 'HPE_INVALID_METHOD',
  rawPacket: <Buffer 47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31 0d 0a 48 6f 73 74 3a 20 6c 6f 63 61 6c 68 6f 73 74 3a 36 30 30 30 0d 0a 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 ... > }
400

推荐阅读