如何引用我试图保存在 nestjs/mongoose 中的模式?

Posted

技术标签:

【中文标题】如何引用我试图保存在 nestjs/mongoose 中的模式?【英文标题】:How can I refer to the schema I was trying to save in nestjs/mongoose? 【发布时间】:2020-05-25 06:17:56 【问题描述】:

在将我的模型保存到 Nestjs 中的 mongoose 之前,我尝试加密一些密码并获取其盐值,但仅使用 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 平台信息:

platform-express 版本:6.10.14

猫鼬版本:6.3.1

普通版本:6.10.14

核心版本:6.10.14

【问题讨论】:

【参考方案1】:

您的pre 挂钩处理程序不应是arrow function () =&gt; 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;
  ,
;

【讨论】:

这真的完全不同,谢谢,但在实施该更改后,该功能不起作用。我将在nestjs git中报告这个错误,感谢您的帮助。 你有什么错误吗?您实际使用的操作是什么?是“保存”吗? 不,我没有收到任何错误,正如您所说,我正在使用“保存”操作。数据简单地流向我的 mongodb 服务器,无需对密码进行哈希处理并保存盐。 我在 NestJS 存储库中看到了您的问题。只是提醒一下,您可能会被要求提供复制品。我将自己进一步调查。您是否尝试过在 Module 装饰器之外创建您的 Schema 并且只使用类似这样的 Schema:MongooseModule.forFeature([name: ‘User’, schema: UserSchema]) 是的,我也尝试过使用 ForFeatureAsync 并在模块本身中声明我的工厂。

以上是关于如何引用我试图保存在 nestjs/mongoose 中的模式?的主要内容,如果未能解决你的问题,请参考以下文章

boost::variant gettor-visitor: 保存返回的引用

C++:试图理解通过引用传递向量

当我引用其他表时,如何保存在 Access 2003 中的表单中创建的数据?

如何在核心数据中保存图像的引用(图像 URL 或路径)并在以后需要时加载?

如何处理 iOS 应用程序中的模型类

如何保存从Kinect 2.0收集的Body数据并将其保存在JSON文件中?