gpt4 book ai didi

typescript - Nest.js/ Mongoose : Why is my pre save hook failing to be triggered?

转载 作者:行者123 更新时间:2023-12-04 13:35:14 24 4
gpt4 key购买 nike

我刚刚开始使用 Nest.js,到目前为止一切顺利。但是,我遇到了一个问题,即用户架构中的 mongoose 预保存钩子(Hook)没有被触发。这应该很简单,但无论出于何种原因,密码都以普通形式保存而不是散列。是什么赋予了?
还有一个小问题 - 在使用 @Prop 装饰器时,如何定义引用另一个模式的字段? profile 字段应该是 mongoose.schema.types.objectid ,它只是 profile: { type: mongoose.Schema.Types.ObjectId, ref: 'Profile' } 在没有装饰器的情况下工作。
下面是相关的片段。
用户架构

import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document } from 'mongoose';

@Schema({
timestamps: true,
})
export class User extends Document {
@Prop({ required: true })
fullname: string;

@Prop({ required: true, unique: true })
username: string;

@Prop({ required: true, unique: true, lowercase: true })
email: string;

@Prop({ required: true })
password: string;

@Prop({ required: true, ref: 'Profile' })
profile: string

@Prop({ required: true, enum: ['admin', 'basic' ]})
role: string
}

export const UserSchema = SchemaFactory.createForClass(User);
用户模块
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import * as bcrypt from 'bcrypt';

import { User, UserSchema } from './user.model';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';

@Module({
imports: [
MongooseModule.forFeatureAsync([
{
name: User.name,
useFactory: () => {
const schema = UserSchema;

schema.pre<User>('save', async function (next: Function) {
const user = this;

const salt = await bcrypt.genSalt(10);
const hashedPassword = await bcrypt.hash(user.password, salt);

user.password = hashedPassword;

next();
});

schema.methods.comparePasswords = async function (submittedPassword) {
const user = this;

await bcrypt.compare(submittedPassword, user.password);
};

return schema;
},
},
]),
],
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {}
用户服务
import { Injectable, HttpException, HttpStatus } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { JwtService } from '@nestjs/jwt';

import { UsersService } from '../users/users.service';
import { ProfilesService } from '../profiles/profiles.service';
import { User } from '../users/user.model';

@Injectable()
export class AuthService {
constructor(
@InjectModel(User.name) private readonly userModel: Model<User>,
private usersService: UsersService,
private profilesService: ProfilesService,
private jwtService: JwtService
) {}

async signup(signupData): Promise<any> {
const foundUser = await this.userModel.findOne({ email: signupData.email });

if (foundUser) {
throw new HttpException(
'Email is already in use',
HttpStatus.BAD_REQUEST
);
}

const createdProfile = await this.profilesService.createProfile();

const createdUser = await this.userModel.create({
...signupData,
profile: createdProfile._id,
role: 'basic',
});

const createdUserCopy = { ...createdUser.toObject() };

delete createdUserCopy.password;
delete createdUserCopy.__v;

const payload = {
username: createdUser.username,
sub: createdUser._id,
};

return {
user: createdUserCopy,
token: this.jwtService.sign(payload),
};
}
}

最佳答案

您不能使用 async结合 next()

schema.pre<User>('save', function (next) {
const user = this;
console.log(user)
next();
});
应该管用

关于typescript - Nest.js/ Mongoose : Why is my pre save hook failing to be triggered?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62553953/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com