这似乎是一个简单的问题,但要找到答案似乎是不可能的。
我正在为一个使用Express和Typescript的后端应用程序构建一个密码重置功能。我使用Postgres作为数据库,使用TypeScript作为数据操作。我有一个 User 实体,在我的数据库中有这两个列:
@Column({
unique: true,
nullable: true,
})
resetPasswordToken!: string;
@Column({ nullable: true, type: 'timestamp with time zone' })
resetPasswordExpiresAt!: Date;
当用户请求密码重置令牌时,resetPasswordToken 和 resetPasswordExpiresAt 字段都将填充所需的值。使用发送到用户电子邮件地址的令牌,用户可以重置其密码。重置用户密码后,我想通过将这两个字段设置为 null 来清除它们:
user.resetPasswordToken = null;
user.resetPasswordExpiresAt = null;
user.save()
但是如果我这样做,Typescript会抱怨我分配 null 值的两行:
类型“null”不能分配给类型“string”。
和
类型“null”不能分配给类型“Date”。
如果我像下面这样将实体中的列更改为接受 null,错误就会消失:
resetPasswordToken!: string | null;
...
resetPasswordExpiresAt!: Date | null;
但是当我启动Express应用程序时,当TypeScript尝试连接到我的数据库时,我得到以下错误:
“postgres”数据库不支持“User.resetPasswordToken”中的数据类型“Object”。
如何将这些字段设置为 null?
5条答案
按热度按时间a64a0gku1#
经过一夜的休息,我终于解决了我的问题。
TypeScript根据您为typescript中的实体给予变量的类型设置数据库字段的类型。TypeScript将下面的代码转换为我的postgres数据库中的一个 varchar 字段,因为我在typescript中给了它一个 string 类型。
这也是我的问题所在。TypeScript获取字段的类型,并尝试根据它读取的类型创建该数据库字段。虽然下面的代码是正确的,但typescript基本上将两种类型封装在一个 object 中,而这个对象正是TypeScript正在读取的对象,从而导致了我得到的错误。
为了解决这个问题,我必须像这样显式地指定数据库字段类型:
gg58donl2#
公认的答案并不完全正确。在MySQL DB上,字符串类型的默认类型转换是“varchar”。因此,如果使用
type: "text"
,它将错误地定义列。如果你想让它与默认行为兼容,你应该像这样使用类型脚本类型。dw1jzc5e3#
zqry0prt4#
为了解决这个问题,我必须像这样显式地指定数据库字段类型:
fdbelqdn5#
要保存具有
null
值的Date
,只需在@Column()
标记中启用nullable:true
,然后保存对象,而不进行属性赋值