dataValues 必须出现在模型名称之后才能检索其值

问题描述 投票:0回答:2

这里是使用sequelizeus 6.x 检索 ForTrade 并连接到 Artwork 和 Viewer 的代码:

let _bid = await ForTrade.findOne({
            where: {id:_id},
            include:[{
                model:Artwork,
                include: [{
                    model:Viewer,
                    attributes:[["wallet_address", "trader_address"]] 
                }]
            }]
        });
        console.log("_bid viewer in addressoftrader : ", _bid.artwork.viewer.dataValues.trader_address);  //this is the right format to retrieve trader_address

这里是模型的关联:

Artwork.belongsTo(Viewer, {foreignKey: 'uploader_id'});
  ForTrade.belongsTo(Artwork, {foreignKey: "artwork_id"});

_bid.artwork.viewer.dataValues.trader_address
可以检索
trader_address
的值,它是一个字符串。但是
_bid.artwork.viewer.trader_address
会产生
undefined
。为什么必须在查看器之后添加
dataValues
才能检索查看器对象?

sequelize.js
2个回答
1
投票

从 findOne() 查询返回的值不是普通对象,而是一个 Sequelize 实例。

可以使用 Sequelize 方法(例如 set()、increment()、decrement() 和 save())来操作该 Sequelize 实例。非常有用。

正如您所见,您可以访问该对象的 dataValues 属性,但我怀疑这被认为是不安全的。但是,您可以通过调用 .toJSON() 方法或 .get() 方法将此实例转换为普通对象。

稍微切线:这个概念没有立即显现出来的原因之一是,当你使用像 Express 这样的东西时,你可以简单地使用 res.json() 方法,传入 _bid 变量,它就会被发送到客户端作为一个普通的对象。原因是 Express .json() 方法在传递给它的对象上寻找 .toJSON() 方法。因此,它将发送普通对象而不是 Sequelize 实例。


0
投票

您可以简单地将

raw: true
添加到查询参数中,然后您将获得数据结果而不是模型实例:

const bids = await ForTrade.findOne({
    where: {id:_id},
    include:[{
        model:Artwork,
        include: [{
              model:Viewer,
              attributes:[["wallet_address", "trader_address"]] 
        }]
    }],
    raw: true // to get results instead of the model instance
});

受到该答案的启发仅从 Sequelize ORM 获取数据值

© www.soinside.com 2019 - 2024. All rights reserved.