尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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),仅供参考
RELATED

相关推荐

C++11多线程同步实战:互斥锁、条件变量与原子操作详解

C++11多线程同步实战:互斥锁、条件变量与原子操作详解

1. 项目概述:为什么C11的多线程同步是每个C工程师的必修课十年前,当我第一次尝试用C写一个需要同时处理网络请求和UI响应的桌面工具时,面对多线程编程,我几乎是手足无措的。那时候,标准库没有原生支持,得依…

📅 2026/9/2 3:25:37
深入原理:ansible-role-postgresql如何实现PostgreSQL数据目录的幂等初始化

深入原理:ansible-role-postgresql如何实现PostgreSQL数据目录的幂等初始化

深入原理:ansible-role-postgresql如何实现PostgreSQL数据目录的幂等初始化 【免费下载链接】ansible-role-postgresql Ansible Role - PostgreSQL 项目地址: https://gitcode.com/gh_mirrors/an/ansible-role-postgresql 在自动化运维中,ansible…

📅 2026/8/27 7:02:39
5分钟快速上手:如何用action-wordpress-plugin-deploy发布你的第一个WordPress插件版本

5分钟快速上手:如何用action-wordpress-plugin-deploy发布你的第一个WordPress插件版本

5分钟快速上手:如何用action-wordpress-plugin-deploy发布你的第一个WordPress插件版本 【免费下载链接】action-wordpress-plugin-deploy Deploy your plugin to the WordPress.org repository using GitHub Actions 项目地址: https://gitcode.com/gh_mirrors/a…

📅 2026/9/15 9:56:03
MORE NEWS

更多资讯

📰

痘痘检测数据集 | 4621张YOLO皮肤健康数据集

痘痘检测数据集 | 4621张YOLO皮肤健康数据集 适用于皮肤管理App、医美咨询与目标检测研究 一、数据集概述 本数据集是一个面向皮肤健康管理的面部痤疮(痘痘)检测数据集,共包含4621张高质量标注图像(训练集4311张、验证集308张、…

📰

只有做过老板的人才懂:真正压垮你的不是没订单,而是这 3 笔账!

前言、先理解一件事:风险是"攒"出来的当了老板之后才明白,外人看到的是表面风光,很少有人知道,你肩上扛着的是一整个团队的生计。 开公司久了,比起怎么赚钱,更考验人的是怎么扛风险。别人下班休息…

📰

电话博弈:利用博弈论与LLM在“机器人战争”中反制电话诈骗

大家读完觉得有帮助记得关注和点赞!!!摘要电话诈骗给全球个人和金融系统带来巨大且不断增长的成本,然而现有反制措施不对施害者施加任何资源成本。战略性诈骗诱饵——即自动代理与诈骗者互动以消耗其操作能力——提供了一种主动替…

📰

【零基础学智能仿真-62】从应变—应力计算弹性常数

课程摘要 本节承接应力与数值收敛检查,以无预应力立方晶体为例,讲解如何通过正负小应变与应力响应拟合C₁₁、C₁₂和C₄₄。结合可运行Python程序与图示,辨析工程剪切与张量剪切,分析残余应力、拟合截距和应变区间对结果的影响,并进行立方晶体弹性稳定性检查。全部数据为…

📰

Java学习进程16

Java Agent 开发 Agent 入门 1.Agent 与基座模型 Agent(智能体)是能够根据用户需求进行判断,并结合工具完成任务的智能程序。 基座模型 是 Agent 的核心语言模型,负责理解用户输入、分析问题并生成回答。可看作百科全书或人的大脑…

📰

Whisky:Apple Silicon Mac 免费运行 Windows 应用与游戏的完整指南

Whisky:Apple Silicon Mac 免费运行 Windows 应用与游戏的完整指南 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 你手里有一个 Windows 独占的工具,下了 .e…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬