如何检测请求正文是否已发送?

How to detect if request body was sent or not?

我正在使用 express + json 正文解析器。出于验证目的,我需要区分

因为我试图提供合理的错误消息,在一种情况下我需要指示用户添加缺失的字段,而在另一种情况下他们甚至可能不知道应该发送请求正文,当务之急是警告他们。

这对我来说目前似乎是不可能的,因为 json 主体解析器将 request.body 设置为 {} 以防未提供请求主体,参考:

https://github.com/expressjs/body-parser/blob/master/lib/types/json.js#L72

我的问题是,在使用 json 正文解析器时,是否可以检测请求正文是否真的由客户端发送?那么我将如何实现这样的功能:

import { Request } from 'express'

function didTheUserSendRequestBody(request: Request): boolean {
  // What do?
}

哪个 returns true 当我的端点被这样命中时:

curl -X POST http://localhost:5000/foo 
   -H "Content-Type: application/json"
   -d '{}'  

false 为此:

curl -X POST http://localhost:5000/foo 

我知道的最简单的方法是检查 req.body 是否为真

function didTheUserSendRequestBody(request: Request): boolean {
  if(req.body){
    // Do stuff
  }
}

根据 https://developer.mozilla.org/en-US/docs/Glossary/Truthy MDN,空对象“{}”是真实的。如果没有发送正文,当您尝试访问 req.body 时它应该是未定义的,这是错误的。

有关详细信息,请参阅 https://expressjs.com/en/api.html#req

Body-parser json 有选项 verify 。它可以在这里查看原始数据。

 app.use(express.json({ verify: (req, res, buf, encoding) => { 
// check buff is empty ? and attach result to req ? 
} }))

with verify 是带有 4 个参数的函数:“其中 buf 是原始请求主体的缓冲区

https://github.com/expressjs/body-parser#verify

也许你可以只检查提交的内容类型,如果用户没有附加它,那么默认值将是“未定义”。

function didTheUserSendRequestBody(request: Request): boolean {
  if (!request.get('Content-Type')) {
    // return any message
  }
}