快递.js - 获取实际发布请求的正文 JSON



我试图在express.js中获得实际的请求体JSON。但我做不到。所有我在互联网上发现的是如何获得类型ReqBody的主体,但我想要实际的JSON,或者,在更好的情况下,从ReqBody查询字段的方法。(在线显示body.usernamebody.password,但其他字段名称呢?我不能只是传递一个字段名称foo,并试图获得body.foo

这是我到目前为止得到的:

router.post('/', function (req, res, next){
let body = req.body;
//?????
});

如果你的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可以从主体中读取一个或多个文件上传。有许多类型的中间件用于许多类型的内容类型。

如果你真的想要原始的,未解析的身体(如果它是JSON就没有必要了),那么你可以使用中间件express.raw()。expression .raw()的不同之处在于它从流中读取主体,但不解析它,因此如果您使用该流,它将接受任何内容类型并将原始数据作为req.body中的Buffer对象。无论您做什么,都不要首先使用该中间件,因为它将读取所有主体,而其他中间件将永远不会获得任何内容。通常,如果您正在使用该中间件,则应在特定于请求处理程序的基础上使用它,而不是将其作为通用中间件。

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

你对req.body的JSON是由express.json()中间件解析的误解。它将包含传入JSON包含的任何属性。这100%是由客户端和它发送的JSON决定的,而不是由某个类预先决定的。如果客户端发送一个名为foobar的属性,如JSON{'foobar':true}所示,并且您在该传入请求上运行express.json()中间件,那么req.body.foobar将包含值true

正如我上面解释的那样,您可以使用中间件express.raw()将RAW JSON转换为Buffer对象(然后您必须自己解析它),但这不是必需的,因为express.json()中间件将为您做所有这些。


仅供参考,在nodejs源代码或Express源代码中似乎没有任何对名为ReqBody的类的引用。似乎有人使用它作为引用req.body对象的快捷方式,而不是这里使用的某个类。

最新更新