NodeJS接口操作数据库正常但不返回状态码无响应问题排查
问题原因
- 核心问题:你仅调用了
res.status()方法设置响应状态码,没有调用res.send()、res.json()、res.end()等方法结束响应流程,服务端一直没有将响应数据返回给客户端,所以接口会持续处于等待状态。
你代码中所有return res.status(200)、return res.status(500)的逻辑都只设置了状态码,没有执行结束响应的操作,只有catch分支调用了res.json()才会正常返回。 - 次要问题:代码中的
print("error")是前端环境的方法,Node.js环境没有内置print方法,执行到这行代码会抛出未定义错误,也可能进一步导致响应卡住。
修复方案
在所有设置完状态码的位置补充结束响应的逻辑即可,参考修改如下:
exports.flagUser = async (req, res) => { try { const user = await FlaggedUser.findOne({ userId: req.body.userId }); if (user) { if (user.flaggedBy.includes(req.body.flaggedBy.toString())) { console.log("error"); // 补充返回逻辑结束响应 return res.status(500).json({msg: "不可重复标记该用户"}); } else { console.log("user found"); await user.updateOne({ $inc: { flagCount: 1 }, $addToSet: { flaggedBy: req.body.flaggedBy }, }); // 补充返回逻辑结束响应 return res.status(200).json({msg: "标记成功"}); } } else { const flaggedUser = new FlaggedUser({ _id: new mongoose.Types.ObjectId(), userId: req.body.userId, flagCount: 1, flaggedBy: [req.body.flaggedBy], }); await flaggedUser.save(); console.log("flag"); // 补充返回逻辑结束响应 return res.status(200).json({msg: "标记成功"}); } } catch (error) { console.log(error); return res.status(500).json({ message: error.message }); } };
内容的提问来源于stack exchange,提问作者Emir Kutlugün
相关产品推荐
相关产品推荐

