【问题标题】:Dynamically added object attributes not available动态添加的对象属性不可用
【发布时间】:2017-02-17 14:24:31
【问题描述】:

我有一个 Stock 对象数组,并尝试将 n 个 Report 对象附加到每个 Stock 对象:

router.get('/stocks', function (req, res, next) {
    Stock.find({}, function (err, stocks) {
        if (err) {
            next(err)
            return
        }

        async.map(stocks, function (stock, callback) {
            Report.find({ 'isin': stock.isin }).sort('-created').limit(10).exec(function (err, reports) {
                if (err) {
                    next(err)
                    return
                }

                stock.reports = reports
                return callback(null, stock)
            })
        }, function (err, stocks) {
            if (err) {
                next(err)
                return
            }

            res.json(stocks)
        })
    })
})

我得到的是股票对象列表没有报告...我想要的是相同的股票,但设置了附加属性reports

最有趣的是,console.log(stock) 在分配 stock.reports = reports 之前和之后是相同的,但 console.log(stock.reports) 提供了实际的报表对象数组...

【问题讨论】:

    标签: javascript node.js mongoose async.js


    【解决方案1】:

    我在this other Stackoverflow topic 中找到了解决方案。解决方案如下:

    而且因为 mongoose 会忽略架构中不存在的字段...

    因为报告对象不在我的股票模型中,猫鼬忽略了它...解决方案是将其添加到猫鼬:

    const StockSchema = new mongoose.Schema({
        ...
        reports: {
            type: mongoose.Schema.Types.Mixed
        },
        ...
    })
    

    【讨论】:

    • 或者你可以Stock.find().lean().exec(function (err, stocks) { })
    【解决方案2】:

    盲拍:如果属性不存在,有时“点。符号”会失败。你可以试试:

    stock['reports'] = reports
    

    而不是

    stock.reports = reports
    

    【讨论】:

    • 我认为“有时”这个词(你有错字!)与编程无关..
    • 可能是真的。但事实是“有时”会发生,而我从未见过关于它的明确条件清单。所以对我来说,这是“虚假”或“随机”的另一种说法。如果这在语义上不正确,请原谅。英语不是我的母语
    • 感谢您的回答,我试过了,它并没有改变任何东西。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2015-12-12
    • 2014-05-29
    • 2012-01-12
    • 1970-01-01
    • 2011-10-05
    • 2017-10-14
    相关资源
    最近更新 更多