sequelize.js - 默认 getter 不返回值,除非在 Sequelize 中使用 TypeScript 时使用 `getDataValue()`
问题描述
使用Model.Create
. 但是,如果我使用,则返回值Model.getDataValue()
例子:
const created = await User.create({
id: '1',
firstname: 'Darth'
});
console.info(created.id, created.firstname); // values are undefined
console.info(created.getDataValue('id'), created.getDataValue('firstname') // outputs correct values
我对文档和示例的理解是这应该返回值。
使用 TypeScript v4.0.3 和 Sequelize v6.3.5
型号定义:
export interface UserAttributes {
id: string;
firstname: string;
createdAt?: Date;
updatedAt?: Date;
}
export interface UserCreationAttributes extends Optional<UserAttributes, 'id'> {
}
export class User extends Model<UserAttributes, UserCreationAttributes> implements UserAttributes {
public id: string;
public firstname: string;
// timestamps!
public readonly createdAt!: Date;
public readonly updatedAt!: Date;
}
User.init(
{
id: {
type: DataTypes.UUIDV4,
primaryKey: true,
},
firstname: {
type: DataTypes.STRING(36),
allowNull: true
},
createdAt: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: DataTypes.NOW,
},
updatedAt: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: DataTypes.NOW,
}
},
{
sequelize,
}
);
解决方案
对于未来的读者:这是 babel 的一个问题。见问题 10579
在类上创建一个构造函数,如下所示:
export class User extends Model<UserAttributes, UserCreationAttributes> implements UserAttributes {
public id: string;
public firstname: string;
...
constructor(values: any = {}, options: object = {}) {
super(values, options)
this.id = values.id
this.firstname = values.firstname
...
}
}
或根据 GitHub 讨论中的示例创建可重用函数:
export default function restoreSequelizeAttributesOnClass(newTarget, self: Model): void {
Object.keys(newTarget.rawAttributes).forEach((propertyKey: keyof Model) => {
Object.defineProperty(self, propertyKey, {
get() {
return self.getDataValue(propertyKey);
},
set(value) {
self.setDataValue(propertyKey, value);
},
});
});
}
并从您的构造函数中调用:
constructor(...args) {
super(...args);
// hydrate the getters
restoreSequelizeAttributesOnClass(new.target, this);
}
推荐阅读
- java - 如何在这里定义 CarInstrumentSimulator
- java - Java中的二进制猜谜游戏
- c - 带有变量的C中的数组声明问题
- electron - 在电子中如何为每个请求发送自定义标头和值?
- android - Smack 在不使用 TLS 时说“等待建立 TLS”
- javascript - 如果主输入表单是(on.change),jQuery 会更改其他值
- database - 数据库架构 - 预订平台
- c++ - 如何在 qt creator 的 main.cpp 中有一个计时器,以便在单击按钮时更新 GUI?
- python-3.x - 如何在 django rest 框架中通过其他字段而不是主键发布外键
- ajax - XMLHTTPRequest 处理事件