使用TypeORM

时间:2018-07-02 07:59:48

标签: javascript node.js typeorm

我有这个成功写入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命令应该永远不会成功。

2 个答案:

答案 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;