You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非管理员访问接口时调用createProduct报.then is not a function错误

问题根因

你的猜测完全正确,createProduct 方法在非管理员分支直接返回了字符串类型的提示文本,不是Promise对象,而路由代码里统一对返回值调用.then()方法,只有Promise对象才具备该方法,因此触发类型错误。

解决方案

方案1:统一返回Promise类型(改动最小)

修改控制器的非管理员分支,把返回的字符串用Promise.resolve()包装为已决议的Promise对象即可,修改后的控制器代码如下:

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 {
    // 把普通返回值包装为Promise对象
    return Promise.resolve('Not authorized to access this page');
  }
};

该方案不需要修改路由层代码,原有逻辑保持一致即可正常运行。

方案2:路由层提前做权限校验(可选优化)

也可以把管理员权限判断逻辑上移到路由层,不需要进入控制器后再处理,代码结构更清晰:

router.post('/create',auth.verify, (req, res)=>{
    const isAdmin = auth.decode(req.headers.authorization).isAdmin;
    // 路由层直接拦截非管理员请求
    if (!isAdmin) {
        return res.send('Not authorized to access this page');
    }
    productController.createProduct(req.body).then(result => res.send(result));
})

采用该方案可以同步简化控制器代码,去掉isAdmin参数的判断逻辑,仅保留商品创建的核心逻辑即可。


内容的提问来源于stack exchange,提问作者quielfala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:09:02