मैं नोड, एक्सप्रेस और टाइपोर्म का उपयोग करके आराम एपीआई पर काम कर रहा हूं। मेरे पास एक उपयोगकर्ता इकाई है:

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);
};

तो, सबसे पहले मैं उपयोगकर्ता इकाई से उपयोगकर्ता को नए मानों के साथ सेट करने और फिर डेटाबेस में स्टोर करने के लिए बना देता हूं।

लेकिन, प्रत्येक विशेषता को एक-एक करके सेट करने से बचने के लिए स्प्रेड ऑपरेटर का उपयोग करने के बाद, नए उपयोगकर्ता के पास वे तरीके नहीं हैं जो उसके पास शुरुआत में थे (हैशपासवर्ड, चेकइफयूएनक्रिप्टेडपासवर्डआईसवैलिड)।

इस समस्या का समाधान किस प्रकार से किया जा सकता है?

0
Richard Muñoz 24 अक्टूबर 2019, 21:01

1 उत्तर

सबसे बढ़िया उत्तर

मुझे एक उपाय मिल गया है। उपयोगकर्ता इकाई में मैंने सेवा से आने वाले गुणों के माध्यम से पुनरावृति करने के लिए एक निर्माता जोड़ा।

constructor(params?: User) {
    for (const key in params) {
      if (params.hasOwnProperty(key)) {
        this[key] = params[key];
      }
    }
  }

ये विकल्प वैकल्पिक भी हो सकते हैं यदि आप केवल एक खाली उपयोगकर्ता ऑब्जेक्ट को इंस्टेंट करना चाहते हैं।

और, उपयोगकर्ता रिपोजिटरी में, रजिस्टर फ़ंक्शन इस प्रकार है:

export const register = async (userData: User) => {
  const user = new User(userData);
  await user.hashPassword();
  const userRepository = getRepository(User);
  await userRepository.save(user);
};

तो अब, दोनों विधियां और गुण उपलब्ध हैं और कोड सरल और स्पष्ट है।

0
Richard Muñoz 30 अक्टूबर 2019, 18:46