Изменить объект в цикле for (async / await) - PullRequest
1 голос
/ 02 апреля 2019
exports.allUsers = async (req, res, next) => {
  try {
    let users = await User.find({})

    console.log(users)
    // [{ role: 'user',
    //   skills: [...],
    //   email: 'first.last@mail.com',
    //   education: [],
    //   createdAt: 2019-04-02T11:17:33.979Z
    // },
    // { role: 'admin',
    //   skills: [...],
    //   email: 'first.lastname@mail.com',
    //   education: [],
    //   createdAt: 2019-04-02T11:17:33.979Z
    // } ]

    for (let i = 0; i < users.length; i++) {
      users[i].bluepages = await bluepagesApi.bluepagesMail(users[i].email)
      users[i].image = await bluepagesApi.profileimage(users[i].email)

      console.log(users[i].bluepages)
      // { 
      //   job: 'Developer',
      //   givenname: 'Tony',
      //   ismanager: 'N',
      //   employeetype: 'P'
      // }
      // { 
      //   job: 'Job Title',
      //   givenname: 'Max',
      //   ismanager: 'N',
      //   employeetype: 'P'
      // }
    }

    console.log(users)
    // [{ role: 'user',
    //   skills: [...],
    //   email: 'first.last@mail.com',
    //   education: [],
    //   createdAt: 2019-04-02T11:17:33.979Z
    // },
    // { role: 'admin',
    //   skills: [...],
    //   email: 'first.lastname@mail.com',
    //   education: [],
    //   createdAt: 2019-04-02T11:17:33.979Z
    // } ]

    return res.json({
      users: users
    })
  } catch (error) {
    next(error)
  }
}

Если я выполняю console.log(users[i].bluepages) внутри моего for-loop, отображаются данные, которые выбираются через API, но если я делаю console.log(users[i]) в моем for-loop, новый объект не отображается.

Также снаружи / после моего for-loop изменения не видны.

Я также пытался сделать это с Array.map, но безуспешно.

Журнал Node.js с моего терминала: https://pastebin.com/w7c50YRt

Ответы [ 2 ]

3 голосов
/ 02 апреля 2019

Мангуст обманывает вас. Он добавляет в документы метод toJSON() и toString(), который показывает только свойства, определенные в модели. Если вы войдете в консоль, будет вызван toString, если вы отправите его как json, то будет вызван toJSON().

console.log(
  users[0], // looks as if bluepages does not exist
  users[0].bluepages // but it does actually
);

Чтобы позволить пользователям вести себя как объекты, сопоставьте их с обычными объектами:

let users = (await User.find({})).map(u => u.toObject());
1 голос
/ 02 апреля 2019

мангуст действует в соответствии с определением пользовательской схемы. Вы должны добавить синие страницы и ключи изображения к схеме пользователя

...