【问题标题】:Mongoose QueryStream and Request ModuleMongoose QueryStream 和请求模块
【发布时间】:2018-11-19 11:54:11
【问题描述】:

在诸如

的模型上执行 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 值,我从用户文档中获得,即使所有文档确实有定义的值。虽然,我没有收到保存不是函数的错误。

任何人都可以了解正在发生的事情吗?

【问题讨论】:

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


    【解决方案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 }
        )
    }
    

    【讨论】:

    • 每个用户都有一个我在帖子选项中发送的独特属性,所以第二个解决方案不起作用,但第一个解决方案很好,不知道 request-promise-native,谢谢
    猜你喜欢
    • 1970-01-01
    • 2014-07-29
    • 2015-10-22
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多