我正在尝试编写一个函数来响应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);
}
在此功能中,Task
和Work
是mongoose
创建的模型。 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;
};
,此功能运行良好。因此,任何人都可以解释原因并提出解决方案?
非常感谢。 对不起,英语不好,我已经使用了很多翻译工具。
答案 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))
})));
}