无法为NodeJS中的对象添加属性

时间:2019-07-02 17:45:01

标签: node.js mongoose

我正在尝试编写一个函数来响应http请求。 这是我的代码:

const listTask = async (req, res) => {
    let tasks = await Task.find();
    let works = await Work.find().select({_id: 1, name: 1});
    tasks.forEach(t => {
      work = works.find(c => parseInt(c._id) === parseInt(t.work_id));
      t.work = work;
      console.log(t);
    });
    res.status(200).json(tasks);
}

在此功能中,TaskWorkmongoose创建的模型。 forEach的循环搜索数组tasks中的每个元素。在这里,我想创建新属性来存储work对象。但是控制台中的消息没有work属性。

我尝试使用console.log(t.work),该消息与工作相同。 我还写了一个类似的函数:

function get_full_name_display(users){
    users.forEach(u => {
        u.full_name_display = u.full_name;
    })
    return users;
};

,此功能运行良好。因此,任何人都可以解释原因并提出解决方案?

非常感谢。 对不起,英语不好,我已经使用了很多翻译工具。

3 个答案:

答案 0 :(得分:1)

您的“工作”变量现在处于全局范围内,您应该在其前面添加 let ,以将范围保留在函数内。

let work = works.find(c => parseInt(c._id) === parseInt(t.work_id));

答案 1 :(得分:1)

如上所述的第一件事也是您的'work'变量未正确声明。 还有一点是,从猫鼬模型返回的任何结果都是不可变的(即猫鼬对象而不是普通的js对象),因此您不能直接更改“任务”中的属性。 试试下面的代码:

const listTask = async (req, res) => {
    let tasks = await Task.find().lean();
    let works = await Work.find().select({_id: 1, name: 1}).lean();
    tasks.forEach(t => {
      const work = works.find(c => parseInt(c._id) === parseInt(t.work_id));
      t.work = work;
      console.log(t);
    });
    res.status(200).json(tasks);
}

您可以在此处了解更多有关lean的信息:https://mongoosejs.com/docs/tutorials/lean.html

答案 2 :(得分:0)

我不太确定为什么不能设置该属性,但是使用不可变模式可能会获得更大的成功:

const listTask = async (req, res) => {
  const tasks = await Task.find();
  const works = await Work.find().select({_id: 1, name: 1});
  res.status(200).json(tasks.map(task => ({
    ...task,
    work: works.find(c => parseInt(c._id) === parseInt(t.work_id))
  })));
}