Express.js - 获得实际的post请求的主体JSON。

1 人不认可

我试图在Express.js中获得实际的请求体JSON。但却无法做到。我在网上找到的都是如何获得 ReqBody ,但我想获得实际的JSON,或者,最好是能从ReqBody查询字段的方法。(网上显示 body.username body.password ,但其他字段的名字呢?我不能只是传递一个字段名 foo ,然后试图得到 body.foo

以下是我目前得到的信息。

router.post('/', function (req, res, next){
  let body = req.body;
//?????
    
11 个评论
"我不能只是传递一个字段名foo并试图获得body.foo。"- 为什么不能?
@Quentin 因为这是一个预先定义好的类别类型。要么它有一个字段,要么它没有。
在Express中,一个经过解析的JSON请求体将具有客户端给它的任何形状。一个原始的主体要么是一个缓冲区,要么是一个字符串。两者都没有预先定义你在解析JSON时得到的类型。
@Quentin 是的,但是 ReqBody 是预定义的,因为它不是原始的JSON。这就是为什么我问如何获得原始JSON的原因。
你从哪里得到这个 ReqBody ?它在哪里被记录下来?(如果你的意思是 req.body 是一个 ReqBody 对象,那么......在其他条件相同的情况下,它不会是,它将是 undefined ,因为在你的代码中没有正文解析器)。
是的。这就是我的意思。req.body是一个ReqBody对象。为什么你说它是未定义的?我做错了什么?
有了这段代码,而没有其他东西, req.body ,将是 undefined 。你使用的是什么中间件,会给它一个值?
我需要任何形式的中间件吗? 网上的例子就按原样使用。
expressjs.com/en/4x/api.html#req.body --API文档非常清楚,除非你有一些中间件,否则它是 undefined
也许你不明白,默认情况下,Express不会从传入的数据流中读取POST请求的正文。 它被留在操作系统或 nodejs 网络缓冲区中。 所以,在一些代码从传入的数据流中读出正文并进行解析之前,req.body中是没有任何东西的。 通常情况下,你会安装一些中间件,比如 express.json() , express.raw() , express.text() express.urlencoded() ,这些中间件会查看内容类型,如果它与他们知道如何解析的内容相匹配,那么他们就会从流中读取正文,解析它并对它进行处理(比如把它放到 req.body )。
express.raw() 不同的是,它从流中读取主体,但不解析它,所以如果你使用那个,它将接受任何内容类型,并将原始数据作为一个Buffer对象放入 。 无论你做什么,都不要先用那个,因为它将读取所有的体,而其他中间件将永远得不到任何东西。 通常情况下,如果你要使用那个,你要在特定请求处理程序的基础上使用它,而不是作为通用的中间件。 req.body
javascript
json
express
http
http-post
Aviv Vetaro
Aviv Vetaro
发布于 2021-07-27
1 个回答
jfriend00
jfriend00
发布于 2021-07-27
0 人赞同

如果你的Post主体的内容类型是JSON,那么你可以这样做。

router.post('/', express.json(), function (req, res, next){
    console.log(req.body);
    // use req.body and send a response here

更常见的是,你会在更高层次上配置express.json() ,使其对该路由器上的所有路由起作用,甚至把它放在app 对象上,使其对所有路由器也起作用。

router.use(express.json());
router.post('/', function (req, res, next){
    console.log(req.body);
    // use req.body and send a response here

express.json() 中间件将检查代表JSON的内容类型,如果匹配,它将从传入的流中读取帖子的主体,解析它在那里发现的JSON,并将产生的Javascript对象放入req.body 。 客户端在它与Post一起发送的JSON中的任何字段都将被放入req.body

如果你没有意识到,默认情况下Express不会从传入的流中读取POST请求的正文。它被留在操作系统或nodejs网络缓冲区中。因此,在一些代码从传入的数据流中读取正文并对其进行解析之前,req.body 。通常,你会安装一些中间件,如express.json()express.text()express.urlencoded() 或其他一些自定义的中间件,每个中间件都会查看内容类型,如果它与他们知道如何解析的内容相匹配,那么他们就会从流中读取主体,解析它并对其进行处理(比如把它放到req.body )。 其他中间件如multer可以从正文中读取一个或多个文件上传。 有很多类型的中间件用于很多类型的内容类型。

如果你真的想要原始的、未经解析的body(如果是JSON就没有必要),那么你可以使用中间件express.raw() 。express.raw()的不同之处在于它从流中读取body,但不解析它,所以如果你使用那个,它将接受任何内容类型并将原始数据作为一个Buffer对象放入req.body 。无论你做什么,首先不要使用那个,因为它将读取所有的体,而其他的中间件将永远不会得到任何东西。通常情况下,如果你要使用那个,你要在特定请求处理程序的基础上使用它,而不是作为通用的中间件。

是的,但是ReqBody是预定义的,因为它不是一个原始的JSON,这就是为什么我问如何获得原始JSON的原因。