使用 nestjs 和 mongoose 哈希密码在生产中崩溃

Posted

技术标签:

【中文标题】使用 nestjs 和 mongoose 哈希密码在生产中崩溃【英文标题】:Hashing password with nestjs and mongoose crashes on production 【发布时间】:2020-11-09 04:04:20 【问题描述】:

在我的 nestjs 应用程序中,我使用 mongoose 的预保存方法来散列密码。 在本地它工作正常。但是在生产/d​​ocker上,它会导致整个嵌套应用程序崩溃。代码如下:

export const UserSchema = new mongoose.Schema(
  email:  type: String, unique: true, lowercase: true, trim: true ,
  password: 
    type: String,
    minlength: [8, 'Password must be 8 characters or more.'],
    maxlength: 100,
  ,
  username: String,
...
  phone:  type: String, default: '' ,
);

UserSchema.pre('save', async function (next: mongoose.HookNextFunction) 
  try 
    if (!this.isModified('password')) 
      return next();
    
    const saltRounds = 14;
    const hashed = await bcrypt.hash(this['password'], saltRounds);
    this['password'] = hashed;
    return next();
   catch (err) 
    return next(err);
  
);

再次,它在本地工作,但在 docker 中,任何用户保存都会导致崩溃(“以代码 0 退出”)。 你发现这段代码有什么问题吗,或者你有更好的方法吗?

【问题讨论】:

“崩溃”是什么意思?你有任何错误的日志吗?您可以分享更多信息吗?蒙哥版?至于更好的方法,我更喜欢让我的模式、实体和其他 DAO 对象尽可能纯净,并在服务中保留任何“预”逻辑。 【参考方案1】:

天哪!我一直在这上面浪费时间。这是解决方案。 bcrypt 在 nodejs 应用程序上往往会失败(等等,什么?bcrypt?每周下载 487K 的 npm 包?是的。) 一个替代方案是 bcryptjs,一个稍微慢一点的 javascript 版本,但是,嘿,它可以工作!

在离您最近的 npm 商店购买:https://www.npmjs.com/package/bcryptjs。

这是我找到它的地方:https://github.com/kelektiv/node.bcrypt.js/issues/432

【讨论】:

以上是关于使用 nestjs 和 mongoose 哈希密码在生产中崩溃的主要内容,如果未能解决你的问题,请参考以下文章

NestJS - 避免返回用户密码

如何在@nestjs/mongoose 模式中设置枚举

NestJS 和 Mongoose 使用 Mongoose-Sequence

如何在 NestJs 和 typescript 中使用 `mongoose-delete` 插件?

nestjs : 定义要在 mongoose 和 graphql 中使用的地图/数组

使用 mongoose 和 nestjs 进行分页