Mongoose QueryStream и модуль запросов - PullRequest
0 голосов
/ 19 ноября 2018

При выполнении QueryStream для такой модели, как

User.find({}).stream().on('data', (user) => {
    request.post(someOptions, (error, response, body) => {
         if(!error && response.statusCode === 200) {
             user.someProperty = body.newValue;
             user.save((err) => {
                 if (err) console.log(err)
             });
         } else {
             console.log(error);
             console.log(response);
         }
}).on('end', () => {
    console.log('all users have new values');
});

Я получаю вывод консоли для события завершения и затем получаю сообщение об ошибке:

all users have new values
TypeError: user.save is not a function
    at Request._callback

Я предполагаю, что это означает, что функция request.post выполняется слишком много раз, так как я пытался сделать это без потока и просто

.find({} (err, users) => {
     for(user in users) {
         request.post...
     } 
});

но это возвращало неверный код состояния из API, который я публикую, так как request.post() отправлял значение undefined в опциях, которые я передаю, которые я получаю из пользовательского документа, даже если все документы есть определенные значения. Хотя я не получил ошибку, потому что сохранение не было функцией.

Может кто-нибудь пролить свет на то, что происходит?

1 Ответ

0 голосов
/ 19 ноября 2018

Вот упрощенная версия, при условии, что вам не нужно stream (что должно быть заменено на cursor), и у вас есть request-promise-native доступно

const users = await User.find().exec()
for(let user of users) {
    const body = await request.post(someOptions)
    if(body) {
        user.someProperty = body.newValue
        await user.save()
    }
}

Из кода похоже, что вы делаете один и тот же post и обновляете одно и то же значение каждого user. Если это так, почему бы и нет:

const body = await request.post(someOptions)
if(body) {
    await User.update(
      { },
      { $set: { someProperty: body.newValue } },
      { multi: true }
    )
}
...