首页 > 解决方案 > Res.send() 返回空数组

问题描述

我正在尝试进行 API 调用,但customizeObj最后是空的。

userRouter.get("/getusers", (req, apiRes) => {
  let users;
  var customizeObj = [];
  User.find()
    .then((res) => {
      users = res;
    })
    .then(() => {
      users.forEach(async (user) => {
        let event = null;
        event = await Event.findById(user.eventID);
        let year = event.date.getFullYear();
        let month =
          event.date.getMonth() + 1 < 10
            ? "0" + event.date.getMonth() + 1
            : event.date.getMonth() + 1;
        let day =
          event.date.getDate() < 10
            ? "0" + event.date.getDate()
            : event.date.getDate();

        customizeObj.push({
          firstName: user.firstName,
          lastName: user.lastName,
          phoneNumber: user.phoneNumber,
          zipCode: user.zipCode,
          type: event.type,
          location: event.location,
          date: new Date(`${year}-${month}-${day}`),
        });
        console.log(customizeObj); // Not empty
      });
      console.log(customizeObj); // Empty
    })
    .then(() => {
      console.log(customizeObj); // Empty
      apiRes.send(customizeObj) // Sends emprty array
    })
    .catch((err) => console.log(err));
});

可以请任何人帮助我吗?我不知道为什么它是空的

标签: node.js

解决方案


基于 express 和 mongoose - 这应该按照上面提供的细节工作。

userRouter.get("/getusers", (req, res) => {
  try{
    let customizeObj = [];
    //get users and lean
    const users = await User.find().lean();
    if(!users.length){
      //should return empty if users don't exist.
      return res.send(customizeObj); 
    }
    //loop over users.
    for(let i = 0 ; i < users.length ; i++){
      //get event of user by users[i].eventID.
      let event = await Event.findById(users[i].eventID).lean();
      //if event exists you create the customized object, if doesn't exist again no element will be pushed to customizeObj array.
      if(event){
        let year = event.date.getFullYear();
        let month =
        event.date.getMonth() + 1 < 10
          ? "0" + event.date.getMonth() + 1
          : event.date.getMonth() + 1;
        let day =
        event.date.getDate() < 10
          ? "0" + event.date.getDate()
          : event.date.getDate();
        customizeObj.push({
            firstName: users[i].firstName,
            lastName: users[i].lastName,
            phoneNumber: users[i].phoneNumber,
            zipCode: users[i].zipCode,
            type: event.type,
            location: event.location,
            date: new Date(`${year}-${month}-${day}`),
          });
      }
    }
    res.send(customizeObj);
  } catch(error){
    console.log('error in api',error);
    res.status(500).send({message: 'unknown error', error});
  }
});

此外,您应该创建一个事件模型的引用,并使用 populate('event') 在单个查询中获取事件,而不是在循环中查询。


推荐阅读