非管理员访问接口时调用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
相关产品推荐
相关产品推荐

