Как я могу ссылаться на схему, которую я пытался сохранить в nestjs / mon goose? - PullRequest
1 голос
/ 10 февраля 2020

Я пытаюсь зашифровать некоторые пароли и получить их соль перед сохранением моей модели в mon goose в Nest js, но простое использование this для ссылки на саму схему не дает никаких результатов, поскольку она ссылается к самому объекту UserSchemaProvider, вместо текущей модели, которую я пытаюсь сохранить.

Мой поставщик схемы:

export const UserSchemaProvider = {
  name: 'User',
  useFactory: (): mongoose.Model<User> => {

      const UserSchema = new mongoose.Schema({
          name: { type: String, required: true },
          email: { type: String, required: true, unique: true },
          password: { type: String, required: true },
          birthday: { type: Date, required: true },
          celphoneNumber: String,
          whatsapp: Boolean,
          promo: Object,
          status: String
      });

      UserSchema.pre<User>('save', async (next) => {
          const user = this;
          console.log(user);
          if (user.password) {
              const salt = await bcrypt.genSalt();
              bcrypt.hash(user.password, salt, (err, hash) => {
                  if (err) return next(err);

                  user.password = hash;
                  next();
              });
          }
      });

      return UserSchema;
  },
};

и мой пользователь Module ниже:

@Module({
  imports: [
      MongooseModule.forFeatureAsync([
          UserSchemaProvider]),
      HttpModule
  ],
  controllers: [UsersController],
  providers: [UsersService, Validator, ValidationPipe, IsEmailInUseConstraint, GoogleRecaptchaV3Constraint],
})

: информация о платформе Nest:

платформа- express версия: 6.10.14

мес goose версия: 6.3.1

общая версия: 6.10.14

базовая версия: 6.10.14

1 Ответ

1 голос
/ 10 февраля 2020

Ваш обработчик pre не должен быть arrow function () => {}. Обработчик mongoose должен иметь контекст выполнения, указывающий на текущее document, которое будет сохранено. При использовании arrow function контекст выполнения ловушки pre больше не является документом, следовательно, this внутри обработчика больше не является самим документом.

export const UserSchemaProvider = {
  name: 'User',
  useFactory: (): mongoose.Model<User> => {

      const UserSchema = new mongoose.Schema({
          name: { type: String, required: true },
          email: { type: String, required: true, unique: true },
          password: { type: String, required: true },
          birthday: { type: Date, required: true },
          celphoneNumber: String,
          whatsapp: Boolean,
          promo: Object,
          status: String
      });

      UserSchema.pre<User>('save', async function(next) { // <-- change to a function instead
          const user = this;
          console.log(user);
          if (user.password) {
              const salt = await bcrypt.genSalt();
              bcrypt.hash(user.password, salt, (err, hash) => {
                  if (err) return next(err);

                  user.password = hash;
                  next();
              });
          }
      });

      return UserSchema;
  },
};
...