Avi*_*aro 3 javascript json http http-post express
我正在尝试在express.js 中获取实际的请求正文JSON。但没能做到。我在互联网上找到的只是如何获取 type 的主体ReqBody
,但我想要实际的 JSON,或者更好的是从 ReqBody 查询字段的方法。(在线显示body.username
,body.password
但是其他字段名称怎么样?我不能只传递字段名称foo
并尝试获取body.foo
.
这是我到目前为止得到的:
router.post('/', function (req, res, next){
let body = req.body;
//?????
});
Run Code Online (Sandbox Code Playgroud)
jfr*_*d00 10
如果您的帖子正文的内容类型是 JSON,那么您可以执行以下操作:
router.post('/', express.json(), function (req, res, next){
console.log(req.body);
// use req.body and send a response here
});
Run Code Online (Sandbox Code Playgroud)
更常见的是,您可以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
});
Run Code Online (Sandbox Code Playgroud)
中间件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()
。express.raw() 的不同之处在于它从流中读取正文,但不解析它,因此如果您使用它,它将采用任何内容类型并将原始数据作为 Buffer 对象放入req.body
. 无论您做什么,都不要首先使用该中间件,因为它会读取所有主体,而其他中间件将永远不会得到任何东西。通常,如果您使用该中间件,您将在特定于请求处理程序的基础上使用它,而不是作为通用中间件。
是的,但是 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()
中间件会为您完成所有这些工作。
仅供参考,似乎没有任何对ReqBody
Nodejs 源代码或 Express 源代码中命名的类的引用。似乎有人使用它作为引用该req.body
对象的快捷方式,并且这里使用的不是某个类。