我正在尝试创建MEAN堆栈应用,目前正在使用UPDATE功能。
我的代码当前遇到此方法失败:
businessRoutes.route('/update/:id').post(function (req, res) {
Business.findById(req.params.id, function (err, business) {
if (!business)
return next(new Error('Could not load Document'));
else {
business.person_name = req.body.person_name;
business.business_name = req.body.business_name;
business.business_gst_number = req.body.business_gst_number;
business.save().then(business => {
res.json('Update complete');
console.log('Update Complete');
})
.catch(err => {
res.status(400).send("unable to update the database");
});
}
});
});
控制台中显示的错误消息是:
TypeError:下一个不是函数
此行代码失败:
return next(new Error('Could not load Document'));
有人可以告诉我为什么会这样以及如何解决吗?
答案 0 :(得分:2)
findById
的第二个参数需要一个回调,该回调具有两个参数err
和<entity>
。没有中间件或其他任何东西,您所谓的next(...)
试图调用您找到的实体。
来自文档
Adventure.findById(id, function (err, adventure) {});
对于您来说,business
始终是未定义的,而adventure
或next
从来都不是函数。
答案 1 :(得分:0)
这可能是您的意思:
问题在于,您要成为“下一个”的参数实际上来自express.js(这意味着它是在您运行的第一个函数回调中出现的(在.post(
之后–该函数---您可以选择使用3个参数:
req
用户对您的服务器的请求res
您准备发送的回复next
第3个参数是可选的,它允许您将其发送到下一个中间件,或者如果将其发送给参数,它将把它发送到错误处理程序,该错误处理程序将错误作为响应发送。另一方面:
您将next
参数随机放置在您试图调用的猫鼬函数的中间:猫鼬函数实际上只需要(错误,项目)...
businessRoutes.route('/update/:id').post(function (req, res, next) {
// note that express exposes the "next" param
// this is a callback indicating to run the `next` middleware
Business.findById(req.params.id, function (err, business, whoKnows) {
// note this is from mongoose.js: the callback function actually only has 2 parameters (err, and foundObject)
if (!business)
return next(new Error('Could not load Document'));
else {
business.person_name = req.body.person_name;
business.business_name = req.body.business_name;
business.business_gst_number = req.body.business_gst_number;
business.save().then(business => {
res.json('Update complete');
})
.catch(err => {
res.status(400).send("unable to update the database");
});
}
});
});
请注意,我建议您使用异步等待,这将使整个事情更容易理解:
businessRoutes.route('/update/:id').post(async (req, res, next) => {
try {
const foundBusiness = await Business.findById(req.params.id)
//... do stuff
catch (e) {
next(throw new Error(e))
// .. other stuff
}
})