我正在开发一个网络应用程序并使用 Sequelize 来管理我的数据库 (Postgres)。 用户总是能被找到并正确返回,但是找到凭证会吐出:
TypeError: Cannot convert undefined or null to object
at hasOwnProperty (<anonymous>)
at credentials._paranoidClause (C:\bots\Trion\node_modules\sequelize\lib\model.js:176:65)
at credentials.findAll (C:\bots\Trion\node_modules\sequelize\lib\model.js:1135:20)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async credentials.findOne (C:\bots\Trion\node_modules\sequelize\lib\model.js:1240:12)
at async login (file:///C:/bots/Trion/routes/auth.js:77:21)
这是我的模型:
用户.js
import { DataTypes } from "sequelize";
import { sequelize } from './SQL.js';
const User = sequelize.define("user", {
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true,
allowNull: false
},
anonymous: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: true
},
username: {
type: DataTypes.STRING,
allowNull: false,
unique: true
},
avatarBlob: {
type: DataTypes.BLOB
}
}, {
sequelize,
tableName: "user",
timestamps: true,
createdAt: "createdAt",
updatedAt: false,
deletedAt: "deletedAt",
paranoid: true
});
User.hasOne(Credentials, {
sourceKey: 'id',
foreignKey: 'userId',
onUpdate: 'CASCADE',
onDelete: 'CASCADE'
});
Credentials.belongsTo(User);
export { User };
凭证.js
import { DataTypes } from "sequelize";
import { sequelize } from './SQL.js';
import { User } from './User.js';
const Credentials = sequelize.define("credentials", {
userId: {
type: DataTypes.INTEGER,
unique: true,
allowNull: false
},
password: {
type: DataTypes.STRING,
allowNull: false,
},
salt: {
type: DataTypes.STRING,
allowNull: false,
}
}, {
sequelize,
tableName: "credentials",
timestamps: true,
createdAt: false,
updatedAt: "updatedAt",
deletedAt: false,
paranoid: true
});
export { Credentials };
这两者是 1:1 相关的,并且从 GUI 客户端查看时有效。
这是问题代码:
let user = await User.findOne({ where: { username: payload.username } });
let creds = await Credentials.findOne({ where: { userId: user.id } });
这里可能发生什么?根据文档,一切看起来都不错,而且它已经让我绕了很长一段时间了。
我尝试通过原始查询找到它,它按预期工作:
'SELECT * FROM credentials WHERE credentials."userId" = ' + user.id + ';'
我还尝试了一些特定的 Sequelize 东西,例如:
await User.findOne({ where: { username: payload.username }, include: Credentials });
输出相同的错误,或者:
await User.getCredentials();
哪个不存在(但文档建议该函数应该自动生成?)。
我自己通过深入调试 Sequelize 找到了答案,这是一个多么愚蠢的错误。 如果您要保持偏执模式,请不要禁用模型上的deletedAt列。