【发布时间】:2019-11-24 03:22:08
【问题描述】:
我有以下中间件:
const mongoose = require('mongoose');
module.exports = function(req, res, next) {
const keys = Object.keys(req.params);
keys.forEach(elem => {
if (
(elem.includes('id') || elem.includes('Id')) &&
!mongoose.Types.ObjectId.isValid(req.params[elem])
)
return res
.status(400)
.json({ msg: `id: ${req.params[elem]} is invalid` });
});
next();
};
在获取请求中调用:
// @route GET api/movies/:id
// @desc Get a movie with specified id from db
// @access Public
router.get('/:id', checkId, async (req, res) => {
const movie = await Movie.findById(req.params.id);
res.json(movie);
});
当我在邮递员中使用无效 id(例如:1234)发出请求时,我收到正确的响应为 400 并带有 msg: 'id 1234 is invalid' 但执行仍然传递到请求回调代码并引发错误当我尝试使用无效 ID 访问数据库时。
所以问题是为什么中间件仍然允许执行 next() 即使它已经返回了 400?
【问题讨论】:
-
这能回答你的问题吗? how to stop middleware chain?
-
您正在循环返回 http 响应!最好写一个承诺并拒绝无效,然后处理承诺。
-
您的主要问题答案是:由于 JS 的异步特性。
标签: node.js middleware