我有这个成功写入MySQL的cURL命令:
curl -d '{"key1":"value", "key2":"value"}' -H "Content-Type: application/json" -X POST http://localhost:3010/customers
该查询能够通过TypeORM库写入数据库,如下所示:
import {Customer} from "../entity/customer";
import {getRepository} from "typeorm";
const RCustomer = getRepository(Customer);
router.post('/', (req, res, next) => {
return RCustomer.save(req.body).then(v => res.json({success: v}));
});
自“ key1”和“ key2”不是客户表中的字段以来,从未发生过!
客户模型如下:
'use strict';
import {Entity, PrimaryGeneratedColumn, Column, Index} from "typeorm";
import {MooveBaseEntity} from "./base";
@Entity()
@Index(["email"], { unique: true })
export class Customer extends MooveBaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
firstName: string;
@Column()
lastName: string;
@Column()
email: string;
@Column()
phonePrimary: string;
@Column()
phoneSecondary: string;
}
所以我在想的是-我需要一种使某些字段为必需的方法。理想情况下,默认情况下所有字段都是必填字段,然后我可以设置一些可选字段(可为空,或其他任何值)。
我该怎么做?基本上,该cURL命令应该永远不会成功。
答案 0 :(得分:4)
实际上,您可以使用第三方验证库,该库可用于在持久性发生之前验证模型:https://github.com/typestack/class-validator
好处-您还可以使用注释来扩展具有额外验证要求的当前模型。
因此,在调用“保存”操作之前,您可以执行验证并依赖验证结果过程或跳过保存操作。
import {validate} from "class-validator";
...
validate(customer).then(errors => { // errors is an array of validation errors
if (errors.length > 0) {
console.log("validation failed. errors: ", errors);
} else {
RCustomer.save(customer).then(v => res.json({success: v}));
}
});
所需属性可以描述为:
@Entity()
@Index(["email"], { unique: true })
export class Customer extends MooveBaseEntity {
@PrimaryGeneratedColumn()
@IsDefined()
id: number;
@Column()
@IsDefined()
firstName: string;
...
}
答案 1 :(得分:2)
您有这种行为,因为save
不在乎发送给它的对象中的属性,除了它需要的属性外。在您的情况下,您没有发送TypeORM所需的任何属性,因此对于typeorm,您的对象基本上是{}
。 save({})
在您的情况下有效,因为您的所有列都不是必需的。要使它们成为必需,您需要显式更改其可为空的状态,例如:
@Column({ nullable: false })
firstName: string;