首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeError:.then不是函数

问TypeError:.then不是函数
EN

Stack Overflow用户
提问于 2021-09-07 08:38:31
回答 3查看 780关注 0票数 1

我有一个错误,当用户不是管理员时,它不显示我的消息“未授权访问此页面”,因为相反,我在控制台中得到这个错误:

代码语言:javascript
复制
    TypeError: productController.createProduct(...).then is not a function

我有一个路由器设置如下:

代码语言:javascript
复制
    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));})

和我的控制器:

代码语言:javascript
复制
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';
  }
};

不过,当用户是管理员时,一切工作正常。我想知道这是否与当用户不是管理员时我如何返回我的消息有关。因为我在使用诺言?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-09-07 08:51:30

基本上有两种方法来解决这个问题。

在第一种方法中,您可以解决API的总体设计问题,并使代码更加有效

例如,如果根据user是否为admin来判断操作是否成功,则可以使用Promise.reject或Promise.resolve进行响应。但是,如果您从createProduct函数返回一个Promise.reject,那么您还应该更新在控制器中处理拒绝的方式。

例如:

createProduct.js

代码语言:javascript
复制
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

代码语言:javascript
复制
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的处理方法,以便捕获您在产品创建部分可能遇到的任何错误。它使错误跟踪变得更容易。

票数 2
EN

Stack Overflow用户

发布于 2021-09-07 08:41:53

在成功和错误的情况下,您都需要返回承诺:

代码语言:javascript
复制
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');
  }
};
票数 2
EN

Stack Overflow用户

发布于 2021-09-07 08:42:43

如果用户不是管理员,并且您需要返回一个承诺,那么它将无法工作,这是正确的。最简单的解决方案是将else语句更改为以下语句。

代码语言:javascript
复制
else{
    return Promise.resolve("Not authorized to access this page")
}

您还可以返回Promise.reject(new Error("Not authorized to access this page")),这将强制使用此函数的任何对象在此场景中处理错误。可能适合你的设计,也可能不适合。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69084925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档