猫鼬QueryStream和请求模块

时间:2018-11-18 22:23:33

标签: javascript node.js mongoose mongoose-schema node-request

之类的模型上执行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 :(得分:1)

这是一个简化的版本,假设您不需要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 }
    )
}