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



下面是使用sequelizeus 6.x检索带有连接到Artwork和Viewer的ForTrade的代码:

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必须在查看器检索查看器对象后添加?

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

这个Sequelize实例可以使用Sequelize方法进行操作,例如set()、increment()、递减()和save()。非常有用。

如您所见,您可以访问该对象的datvalues属性,但我怀疑这被认为是不安全的。但是,您可以通过调用. tojson()方法或.get()方法将该实例转换为普通对象。 稍微切题一下:这个概念不是很明显的原因之一是,当您使用Express之类的东西时,您可以简单地使用res.json()方法,传入_bid变量,然后它将作为普通对象发送给客户端。这是因为Express .json()方法在传入的对象上查找. tojson()方法。因此,它将发送普通对象而不是Sequelize实例。

最新更新