Mongoose模型3大核心技巧:koa-react-full-example的pre-save钩子与bcrypt-thunk实战
Mongoose模型3大核心技巧koa-react-full-example的pre-save钩子与bcrypt-thunk实战【免费下载链接】koa-react-full-exampleFull example using Koa, React, Passport, Mongoose, Webpack, Mocha, Babel项目地址: https://gitcode.com/gh_mirrors/ko/koa-react-full-examplekoa-react-full-example 是一个将 Koa、React、Passport 与 Mongoose 完整串起来的全栈实战示例。本文带你剖析其中Mongoose 模型的 3 大核心技巧pre-save 钩子自动哈希密码、bcrypt-thunk 的 Promise 包装以及登录校验的完整链路——即使你是 Mongoose 新手也能照着学会这套「密码安全三件套」。 核心关键词Mongoose 模型、pre-save 钩子、bcrypt-thunk、密码哈希、Koa React 全栈技巧一pre-save 钩子自动哈希密码新用户注册时我们绝不想把明文密码存进数据库。Mongoose 提供了pre-save 钩子在save()写入数据库之前自动执行你定义的逻辑。在src/models/user.js#L21-L37中用户模型的保存流程被这样增强UserSchema.pre(save, function (done) { // 只有密码被修改或新建时才哈希避免重复哈希 if (!this.isModified(password)) { return done(); } // 生成盐值 → 哈希密码 → 替换原字段 var salt yield bcrypt.genSalt(); this.password yield bcrypt.hash(this.password, salt); done(); });这里藏着两个值得抄走的细节细节作用isModified(password)判断防止更新其他字段如昵称时把已哈希的密码再哈希一次导致密码彻底失效每次保存动态生成 salt相同明文密码也会得到不同哈希值防彩虹表攻击 同样的钩子机制在src/models/count.js#L13-L16还有更简单的用法pre-save 时刷新updated时间戳实现「自动更新时间」字段——这就是钩子的第二个常见场景。技巧二用 bcrypt-thunk 把回调 API 变成 Promisebcrypt原生是回调风格bcrypt.hash(data, salt, cb)而本项目用co库以yield编写异步逻辑两者并不兼容。项目的解法在lib/bcrypt-thunk.js把genSalt、hash、compare三个方法各包一层 Promisemodule.exports.hash function (data, salt) { return new Promise(function (resolve, reject) { bcrypt.hash(data, salt, function (err, hash) { if (err) { return reject(err); } return resolve(hash); }); }); };这样一来模型里就能像读同步代码一样写yield bcrypt.hash(...)。配套的单元测试test/test-bcrypt-thunk.js覆盖了三个典型场景生成盐值、错误轮次抛错、密码匹配/不匹配——这套「薄包装 单测」的思路可以套用到任何回调式第三方库上。技巧三校验链路 toJSON 安全脱敏哈希只解决了「存」「验」由两层方法完成实例方法comparePasswordsrc/models/user.js#L42-L44拿用户输入与库里哈希比对静态方法passwordMatchessrc/models/user.js#L50-L61按用户名查用户 → 比对密码 → 不匹配就抛错。lib/authenticator.js中这两个方法被接入 Passport 的本地策略登录请求src/controllers/auth.js#L6-L16最终走User.passwordMatches完成鉴权。还有一个容易被忽视的安全细节——Schema 的toJSON.transformsrc/models/user.js#L11-L15模型序列化为 JSON 时自动删除 password 字段即使控制器不小心把整个 user 对象返回给前端密码哈希也泄露不出去。速查Mongoose 模型相关文件地图文件职责src/models/user.js用户模型pre-save 哈希、toJSON 脱敏、校验方法src/models/count.js计数器模型pre-save 更新时间戳lib/bcrypt-thunk.jsbcrypt 的 Promise 化薄包装lib/authenticator.jsPassport 本地策略胶水层src/controllers/auth.js注册 / 登录 / 登出控制器test/test-bcrypt-thunk.js哈希工具单元测试test/test-auth.js登录鉴权集成测试一键跑起来本地启动指南想亲手验证这 3 个技巧只需准备 Node.js≥ 0.12与 MongoDB然后git clone https://gitcode.com/gh_mirrors/ko/koa-react-full-example cd koa-react-full-example npm install npm run build npm test # 先跑测试验证环境开发模式需要开两个终端一个跑npm run hot-dev-serverReact 前端热重载另一个跑npm startKoa 后端。访问localhost:3000在#/signup注册后自动登录进入计数器页面——你注册的密码此刻就经过了 pre-save 钩子的 bcrypt 哈希存进 MongoDB 的只是那串$2a$10$...哈希值。一句话总结pre-save 钩子管「写前加工」bcrypt-thunk 管「异步兼容」toJSON 脱敏管「读时安全」——这三招组合起来就是一个 Mongoose 项目里最实用的密码安全骨架。【免费下载链接】koa-react-full-exampleFull example using Koa, React, Passport, Mongoose, Webpack, Mocha, Babel项目地址: https://gitcode.com/gh_mirrors/ko/koa-react-full-example创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考