开发者问题收集

Sequelize 不返回对象而是返回额外的数据

2020-03-18
1446

当我使用 sequelize 运行任何查找函数时,我希望获得我想要获取的数据的对象,相反,我得到了一堆额外的数据。 这是我打印 sequelize 给我的结果时得到的

这是我运行的代码:

getAllHubsByUser: function(userId, callback){
        db.User.findByPk(userId)
            .then(function(user) {
                user.getSubscriptions()
                    .then(function(hubs){
                        dataValuesHubs = []
                        for (hub in hubs) {
                            dataValuesMembers.push(hub.dataValues)
                        }
                        callback(dataValuesHubs, null)
                    })
                    .catch(function(error){
                        callback(null, error)
                    })
            })
            .catch(function(error) {
                callback(null, error)
            })
    },

我在名为 Hubs 和 Users 的表之间存在多对多关系,许多用户可以订阅许多中心。关系如下所示:

User.belongsToMany(Hub, {as: "Subscriptions", through: 'hubSubscriptions', foreignKey: 'userId'})
Hub.belongsToMany(User, {as: "Subscribers", through: 'hubSubscriptions', foreignKey: 'hubId'})

由于 sequelize 不返回对象,因此运行 user.getSubscriptions() 时出现错误: “未处理的拒绝 TypeError:无法读取未定义的属性‘findAll’”

如何让 sequelize 返回一个对象?

2个回答

您刚刚获得了一个具有自己的附加道具和方法的 sequelize 模型对象实例。 要获取普通对象,请执行以下操作:

const plainUser = user.get({ plain: true })
console.log(plainUser)
Anatoly
2020-03-18

正如 @Anatoly 所述,您将获得 Sequelize . Model 对象,其中包含其内部启动的所有道具和方法。要获取纯 javascript 对象,您可以使用以下实现

getUserByEmail: function(email, callback) {
        db.User.findOne({
            where: {email: email},
            raw: true // Get the raw object.
        })
            .then(function(user){
                console.log(user)
                if (user) {
                    callback(user.dataValues, null)
                } else {
                    callback(null, null)
                }
            })
            .catch(function(error){
                console.log(error)
                callback(null, error)
            })
}

如果您希望所有查询都默认返回纯对象,请查看此 答案

Ratul Sharker
2020-03-18