【发布时间】:2019-08-18 06:05:38
【问题描述】:
上下文:我正在测试一个进出数据库的简单模型。不是真正的测试,它是一些集成测试的先驱。使用 Sequelize 和 findOne。
问题:返回的模型实例上的直接数据,即 email.ulid、email.address、email.isVerified 未定义。
我的问题:为什么它们没有定义?
Sequelize: 5.15.0
Typescript: 3.5.3
mysql Ver 15.1 Distrib 10.4.6-MariaDB
记录到数据库:
await testingDatabase.sync({
force: true
}).then(async () => {
await Email.create({
ulid: the_ulid.bytes,
address: "dave@world.com",
isVerified: false
})
})
取回记录:
await Email.findOne({
where: {
address: "dave@world.com"
}
, rejectOnEmpty: true //to shut typescript up
}).then( emailData => {
console.log("Email: ", email)
})
Console.log of email 实例:
Email: Email {
dataValues: {
ulid: <Buffer 01 6c a3 36 11 9c 1e 9b a6 ce 60 b7 33 3e e7 21>,
address: 'dave@world.com',
isVerified: false,
deletedAt: null,
createdAt: 2019-08-18T05:32:05.000Z,
updatedAt: 2019-08-18T05:32:05.000Z
},
...,
isNewRecord: false,
ulid: undefined,
address: undefined,
isVerified: undefined,
createdAt: undefined,
updatedAt: undefined,
deletedAt: undefined
}
^^^ 如上所示,实例上的所有直接属性都是空的。
以下工作,但副作用是 isVerified 返回为 0 而不是 false,随后无法与原始数据进行直接比较。此外,我失去了模型实例的其他功能,这些功能将在更复杂的模型上派上用场:
Email.findOne({
where: { address: "dave@world.com" }
, raw: true
, rejectOnEmpty: true
})
这些也有效,但结果是 Typescript 抱怨返回的对象没有我随后访问的属性(尽管它们确实存在并且测试有效):
.then( emailData => {
console.log("All getters: ", emailData.get())
// AND
console.log("All getters(plain): ", emailData.get({plain: true}))
// AND
console.log("toJSON: ", emailData.toJSON())
})
下一个(由 Vivek 建议),只要数据可用,就可以工作,但 JSON.parse 无法正确处理 Buffer:
const dataOnly = JSON.parse(JSON.stringify(emailData))
其他人抱怨 (SE answer) console.log 以某种方式错误打印了实例,但我访问这些属性的所有其他方式仍然未定义。
【问题讨论】:
-
我还尝试了
mapToModel和instance设置,希望它能刺激模型填充。它没有。 -
观看github.com/sequelize/sequelize/issues/10917,尽管这只是解决了目前发现的一些变通办法的副作用,而不是“为什么它们未定义”的实际问题。
-
完全相同的问题11326,因为这个问题存在于sequelize github上。
标签: node.js sequelize.js