Sequelize 关系错误:无法将 undefined 或 null 转换为对象

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

我正在开发一个网络应用程序并使用 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();

哪个不存在(但文档建议该函数应该自动生成?)。

javascript node.js sequelize.js
1个回答
0
投票

我自己通过深入调试 Sequelize 找到了答案,这是一个多么愚蠢的错误。 如果您要保持偏执模式,请不要禁用模型上的deletedAt列。

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