使用Express内置body parser时请求无限加载无响应如何解决?
问题原因
- 核心原因:
Express.json是Express提供的用于生成JSON解析中间件的工厂函数,代码中没有调用该函数,而是直接将函数本身作为中间件注册。正确用法是调用这个函数返回中间件实例,即需要写为Express.json()。直接传递Express.json的情况下,该函数接收到req、res、next参数后不会执行JSON解析逻辑,也不会调用next()将请求传递给后续路由,导致请求被永久挂起,出现无限加载的情况,这也符合你停用body parser后请求恢复正常的表现。 - 次要问题:POST接口的逻辑中,数据库操作成功后仅调用了
res.status(200),没有调用res.send()、res.end()、res.json()等方法主动结束响应,即便body parser的问题修复后,POST请求仍然会出现无限加载的问题。
解决方法
修复后的完整代码如下:
const Express = require("express") const db = require("./database") const app = Express() // 修复1:调用Express.json()生成中间件实例 app.use(Express.json()) app.get("/api", ((req, res) => { res.status(200).send("The API is working") })) app.post("/api/user/:id/settings",(req, res) => { console.log("It works") db.edit({user: req.params.id}, req.body, "user") .then(() => { // 修复2:设置状态码后调用send方法主动结束响应,可根据业务需求自定义返回内容 res.status(200).send({success: true, message: "配置更新成功"}) }) .catch(err => { res.status(500).send(err) console.error(err) }) }) app.listen(3000) console.log("API is ready")
修改点说明:
- 把
app.use(Express.json)改为app.use(Express.json()),正确注册JSON解析中间件,请求会正常流转到后续路由,同时可以正常获取req.body的内容 - 把POST接口成功回调里的
res.status(200)改为res.status(200).send(返回内容),主动结束响应,避免请求挂起
内容的提问来源于stack exchange,提问作者Raptor
相关产品推荐
相关产品推荐

