網站搜尋

node.js - TypeORM:在實體的類方法中訪問 select:false 的屬性


我正在使用 TypeORM、Express 和 Passport 來進行身份驗證,並用 Typescript 建立一個應用程式。

我已在檔案 entities/User.ts 中使用 TypeORM 定義了一個使用者模型。

密碼欄位使用欄位選項 select: false 進行保護,以便在抓取使用者時不返回密碼(密碼在插入資料庫之前會被哈希與加鹽,但我仍然不希望透過 API 返回已哈希的密碼)。

我在 User 上定義了一個 validPassword 方法,用來檢查使用者輸入的密碼是否與哈希密碼匹配(使用 bcrypt.compareSync)。問題是,當密碼欄位設置了 select: false 時,我無法在 validPassword 方法中訪問 this.password。

我知道可以透過在查詢建構器中明確使用 addSelect 從類別外部訪問密碼,但我無法在 validPassword 方法內部使其工作。

請參見下面我 User.ts 檔案的程式碼。當我在 password 上使用 select: true 時,validPassword 方法運作正常。

任何幫助都感激。

// entities/User.ts
import { Entity, Column, PrimaryGeneratedColumn, BeforeInsert } from "typeorm"

import bcrypt from "bcrypt-nodejs";
import IUser from "../auth/user.model";
import Logger from "../logging/logger";

@Entity()
export default class User implements IUser {
  @PrimaryGeneratedColumn()
  userId: string

  @Column()
  username: string

  @Column( {select: false })
  password: string

  @Column({ nullable: true })
  email: string

  validPassword(password: string) {
    try {
      Logger.debug("Comparing PW");
      if(this.password && this.password != null) {
        const pwValid = bcrypt.compareSync(password, this.password);
        return pwValid;
      } else {
        Logger.info("No PW")
        return false;
      }
    } catch (err) {
      Logger.error(`Error while comparing PW`, err.message);
    }
  }

  @BeforeInsert()
  hashPassword() {
    Logger.info("Hashing PW before save.")
    this.password = bcrypt.hashSync(this.password, bcrypt.genSaltSync(10));
  }
}