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

React+Node.js项目Cannot destructure property 'err'报错如何解决

错误原因

你遇到的报错是混用Mongoose回调写法和async/await语法导致的,核心有两个问题:

  1. 当你给Users.findOne()传入回调函数时,Mongoose不会返回Promise实例,await操作拿到的结果为undefined。同时你在回调函数内部写的return语句只会返回给回调本身,无法穿透到外层的acceptTestimonial/rejectTestimonial函数,导致这两个控制器最终没有返回任何值,路由层对undefined做解构赋值就触发了对应的类型错误。
  2. 额外的参数传递问题:REJECT分支的路由里你传的是完整的req.user对象,但是rejectTestimonial初始定义的形参是userId,查询逻辑需要对应调整。
修复方案

把所有Mongoose操作改为纯async/await写法,去掉回调函数即可,修正后的代码如下:

修正后的acceptTestimonial

const acceptTestimonial = async (testimonialId, userId) => {
  try {
    const creator = await Users.findOne({ _id: userId });
    if (!creator) return { err: "用户不存在", status: 404, data: null };
    
    creator.testimonials = creator.testimonials.map((testimonial) => {
      if (testimonial._id == testimonialId) {
        testimonial.status = 'PUBLISHED';
      }
      return testimonial;
    });
    await creator.save();
    return { err: null, status: 200, data: creator };
  } catch (err) {
    return { err: err.toString(), status: 500, data: null };
  }
};

修正后的rejectTestimonial

const rejectTestimonial = async (testimonialId, user) => {
  try {
    // 调整为从传入的user对象取_id查询
    const creator = await Users.findOne({ _id: user._id });
    if (!creator) return { err: 'Creator not found!', status: 404, data: null };
    
    creator.testimonials = creator.testimonials.map((testimonial) => {
      if (testimonial._id === testimonialId) {
        testimonial.status = 'REJECTED';
      }
      return testimonial;
    });
    await creator.save();
    return { err: null, status: 200, data: creator };
  } catch (err) {
    return { err: err.toString(), status: 500, data: null };
  }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:54:02