Node.js 将值指定给对象后缺少函数

Node.js 将值指定给对象后缺少函数,node.js,typeorm,Node.js,Typeorm,我正在使用node、express和typeorm开发RESTAPI。 我有一个用户实体: import { Entity, PrimaryGeneratedColumn, Column, Unique, CreateDateColumn, UpdateDateColumn } from "typeorm"; import bcrypt from "bcryptjs"; export enum userRole { ADMIN = "ADMIN", USER =

我正在使用node、express和typeorm开发RESTAPI。 我有一个用户实体:

import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  Unique,
  CreateDateColumn,
  UpdateDateColumn
} from "typeorm";
import bcrypt from "bcryptjs";

export enum userRole {
  ADMIN = "ADMIN",
  USER = "USER"
}

@Entity()
@Unique(["username"])
export class User[![enter image description here][1]][1] {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ type: "varchar", length: 50 })
  username: string;

  @Column({ type: "varchar", length: 255 })
  password: string;

  @Column({ type: "enum", enum: userRole })
  role: string;

  @CreateDateColumn({ name: "created_at" })
  createdAt: Date;

  @UpdateDateColumn({ name: "updated_at" })
  updatedAt: Date;

  hashPassword() {
    this.password = bcrypt.hashSync(this.password, 8);
  }

  checkIfUnencryptedPasswordIsValid(unencryptedPassword: string) {
    return bcrypt.compareSync(unencryptedPassword, this.password);
  }
}
以及用于保存用户的存储库功能:

export const register = async userData => {
  let user = new User();

  // THIS CODE WORKS AS EXPECTED
  // BUT IS TEDIOUS TO ASSIGN EACH PROPERTY ONE BY ONE
  // user.username = userData.username;
  // user.password = userData.password;
  // user.role = userData.role;

  // I WAS TRYING WITH SPREAD, BUT NO LUCK
  user = { ...userData };

  // BECAUSE, THEN IT SAYS THAT THE user DOESN'T HAVE
  // THE hashPassword METHOD
  user.hashPassword();
  const userRepository = getRepository(User);
  await userRepository.save(user);
};
所以,首先我从用户实体创建一个用户,设置新值,然后存储在数据库中

但是,在使用spread运算符避免逐个设置每个属性后,新用户没有开始时使用的方法(hashPassword、checkIfUnencryptedPasswordIsValid)

如何解决这个问题?

我找到了一个解决方法。 在用户实体中,我添加了一个构造函数来迭代来自服务的属性

constructor(params?: User) {
    for (const key in params) {
      if (params.hasOwnProperty(key)) {
        this[key] = params[key];
      }
    }
  }
如果您只想实例化一个空的用户对象,这些选项也可以是可选的

在userRepository中,注册函数如下所示:

export const register = async (userData: User) => {
  const user = new User(userData);
  await user.hashPassword();
  const userRepository = getRepository(User);
  await userRepository.save(user);
};
现在,方法和属性都可用,代码简单明了