我有一个错误,当用户不是管理员时,它不显示我的消息“未授权访问此页面”,因为相反,我在控制台中得到这个错误:
TypeError: productController.createProduct(...).then is not a function我有一个路由器设置如下:
router.post('/create',auth.verify, (req, res)=>{
const isAdmin = auth.decode(req.headers.authorization).isAdmin;
productController.createProduct(req.body,isAdmin).then(result => res.send(result));})和我的控制器:
module.exports.createProduct = (reqBody, isAdmin) => {
if (isAdmin === true) {
let newProduct = new Product({
name: reqBody.name,
description: reqBody.description,
price: reqBody.price,
});
return newProduct.save().then((result, error) => {
return error ? false : 'Successfully created a product';
});
} else {
return 'Not authorized to access this page';
}
};不过,当用户是管理员时,一切工作正常。我想知道这是否与当用户不是管理员时我如何返回我的消息有关。因为我在使用诺言?
发布于 2021-09-07 08:51:30
基本上有两种方法来解决这个问题。
在第一种方法中,您可以解决API的总体设计问题,并使代码更加有效
例如,如果根据user是否为admin来判断操作是否成功,则可以使用Promise.reject或Promise.resolve进行响应。但是,如果您从createProduct函数返回一个Promise.reject,那么您还应该更新在控制器中处理拒绝的方式。
例如:
createProduct.js
module.exports.createProduct = (reqBody, isAdmin) => {
if (isAdmin === true) {
let newProduct = new Product({
name: reqBody.name,
description: reqBody.description,
price: reqBody.price,
});
return newProduct.save().then((result, error) => {
return error ? false : 'Successfully created a product';
});
} else {
// Return a promise here
return Promise.reject('Not authorized to access this page');
}
};controller.js
router.post('/create',auth.verify, (req, res)=>{
const isAdmin = auth.decode(req.headers.authorization).isAdmin;
productController.createProduct(req.body,isAdmin)
.then(result => res.send(result))
.catch(error => res.send(error)); // catch will be executed due to Promise.reject
})或者,在第二种方法中,您可以简单地从createProduct函数的else块返回一个Promise.resolve。
示例:
return Promise.resolve("Not authorized to access this page")
在这种情况下,您不需要更新控制器代码。
我建议您遵循.then .catch的处理方法,以便捕获您在产品创建部分可能遇到的任何错误。它使错误跟踪变得更容易。
发布于 2021-09-07 08:41:53
在成功和错误的情况下,您都需要返回承诺:
module.exports.createProduct = (reqBody, isAdmin) => {
if (isAdmin === true) {
let newProduct = new Product({
name: reqBody.name,
description: reqBody.description,
price: reqBody.price,
});
return newProduct.save().then((result, error) => {
return error ? false : 'Successfully created a product';
});
} else {
// Return a promise here
return Promise.reject('Not authorized to access this page');
}
};发布于 2021-09-07 08:42:43
如果用户不是管理员,并且您需要返回一个承诺,那么它将无法工作,这是正确的。最简单的解决方案是将else语句更改为以下语句。
else{
return Promise.resolve("Not authorized to access this page")
}您还可以返回Promise.reject(new Error("Not authorized to access this page")),这将强制使用此函数的任何对象在此场景中处理错误。可能适合你的设计,也可能不适合。
https://stackoverflow.com/questions/69084925
复制相似问题