[英]Express.js - get the actual post request's body JSON
我正在尝试在 express.js 中获取实际的请求正文 JSON。 但是没办法。 我在互联网上找到的只是如何获取ReqBody
类型的ReqBody
,但我想要实际的 JSON,或者更可取的是,一种从 ReqBody 查询字段的方法。 (在线显示body.username
和body.password
但其他字段名称呢?我不能只传递字段名称foo
并尝试获取body.foo
。
这是我到目前为止所得到的:
router.post('/', function (req, res, next){
let body = req.body;
//?????
});
如果您的帖子正文的内容类型是 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
。 req.body
。 客户端放入与 Post 一起发送的 JSON 中的任何字段都将在req.body
。
如果您没有意识到,默认情况下 Express 不会从传入流中读取 POST 请求的正文。 它留在操作系统或 nodejs 网络缓冲区中。 因此,在某些代码从传入流中读取主体并对其进行解析之前, req.body
什么都没有。 通常,您会安装诸如express.json()
、 express.text()
或express.urlencoded()
等中间件或其他一些自定义中间件,并且每个中间件都会查看内容类型,如果它与他们知道如何解析的内容相匹配,然后他们从流中读取主体,解析它并用它做一些事情(比如把它放在req.body
)。 其他中间件如 multer 可以从正文中读取一个或多个上传的文件。 对于许多类型的内容类型,有许多类型的中间件。
如果你真的想要原始的、未解析的主体(如果它是 JSON 则不需要),那么你可以使用中间件express.raw()
。 express.raw() 的不同之处在于它从流中读取主体,但不解析它,因此如果您使用该主体,它将采用任何内容类型并将原始数据作为 Buffer 对象放入req.body
. 无论你做什么,都不要首先使用它,因为它会读取所有主体,而其他中间件将永远不会得到任何东西。 通常,如果您正在使用那个,您将在特定于请求处理程序的基础上使用它,而不是作为通用中间件。
是的,但 ReqBody 是预定义的,因为它不是原始 JSON。 这就是为什么我要问如何获取原始 json
您对由express.json()
中间件解析的 JSON 的req.body
存在误解。 它将包含传入 JSON 包含的任何属性。 这 100% 由客户端和它发送的 JSON 决定,根本不是由某个类预先确定的。 如果客户端在此 JSON {'foobar':true}
发送名为foobar
的属性,并且您在该传入请求上运行express.json()
中间件,则req.body.foobar
将包含值true
。
正如我上面解释的,您可以使用中间件express.raw()
将 RAW JSON 转换为Buffer
对象(然后您必须自己解析它),但这不是express.json()
中间件所必需的会为你做这一切。
仅供参考,nodejs 源代码或 Express 源代码中似乎都没有对名为ReqBody
的类的任何引用。 似乎有人使用它作为引用req.body
对象的快捷方式,而不是这里使用的某个类。
尝试使用正文解析器body-parser github
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.