Express中return res.json未按预期终止请求执行问题排查
问题根因
你代码中的return res.json(...)语句仅作用于Sample.findOne的.then()回调函数内部,该返回只会终止当前回调的执行,并不会中断外层app.post异步处理函数的后续逻辑。await只会等待整个Promise状态变更、拿到.then()链的执行结果,但不会因为回调内部的返回就终止外层函数运行,因此即使用户存在的判断命中,后续Sample.create的代码依然会被执行。
无需添加
unique: true约束的解决方案: - 方案1:统一使用async/await写法,避免混合
.then()造成作用域混乱
直接通过await获取查询结果,此时return直接作用于外层请求处理函数,命中判断后直接终止后续逻辑:
该写法逻辑链路更清晰、更易维护,绝大多数同类场景都可以用这套逻辑模板app.post('/api', async (req, res) => { const existUser = await Sample.findOne({ username: req.body.username }) if (existUser) { console.log(existUser) return res.json('This user already exists in my database') } await Sample.create({ username: req.body.username, password: req.body.password }) return res.json('User created') }) - 方案2:保留
.then()写法的前提下,将后续业务逻辑全部移入回调内部
只有未命中用户存在判断时才执行创建逻辑:app.post('/api', async (req, res) => { await Sample.findOne({ username: req.body.username }).then(async data => { if(data) { console.log(data) return res.json('This user already exists in my database') } await Sample.create({ username: req.body.username, password: req.body.password }) return res.json('User created') }) })
内容的提问来源于stack exchange,提问作者easymoney
相关产品推荐
相关产品推荐

