我试图在express.js中获得实际的请求体JSON。但我做不到。所有我在互联网上发现的是如何获得类型ReqBody
的主体,但我想要实际的JSON,或者,在更好的情况下,从ReqBody查询字段的方法。(在线显示body.username
和body.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
对象的快捷方式,而不是这里使用的某个类。