Error: Digest already called报错详细解决方案
不是很麻烦的错误,但是却是很容易忽略掉的问题。由于之前自己的后端逻辑都是只加密新密码
所以也是第一次遇到这个问题。
写在前面
前端编写修改密码页面,在使用node中crypto模块进行MD5加密时,对old_pass(原密码)和new_pass(新密码)两个字段同时进行MD5加密时出现了该错误。
一、分析报错信息
浏览器F12报错提示报错详细显示:
不难看出:它在告诉你在使用node中crypto模块进行MD5加密时多次调用了Digest方法
二、探究报错原因
查看报错信息定位到代码
可以定位到报错代码的位置:
代码片段如下:
// 对密码进行MD5加密
let md5 = crypto.createHash('md5')
md5.update(this.passwordForm.new_password)
const md5NewPassword = md5.digest('hex')
// 下面的是后面需求改变的时候增加的 事实证明还是太年轻
md5.update(this.passwordForm.old_password)
const md5OldPassword = md5.digest('hex')
小插曲
F哥让我给原密码也加密时,我当时的想法太简单了。
(内心os:要多加密一个字段,小事情,看我直接ctrl+d 加密第二个数据,over!)
事实上,node无情给了我当头一棒!
通过查看官网的信息分析代码片段 Node crypto官方文档
分析
:文档里说明了一个crypto实例只能调用digest一次,所以我上面的代码片段调用方法是错误的,一个实例同时调用两次digest——故而报错Error: Digest already called
三、找到解决办法
结合错误原因并改正代码
找到了代码出错的原因之后问题就很好解决了。一个crypto实例只能调用一次digest方法
改动后如下:
// 分别创建新实例
const crypto = require('crypto');
let md5OldPassword = crypto.createHash('md5').update(this.passwordForm.old_password).digest('hex');
let md5NewPassword = crypto.createHash('md5').update(this.passwordForm.new_password).digest('hex');
这样写每次调用digest方法都重新创建以个新的crypto实例
写在结尾
至此问题完美解决。感谢阅读,喜欢把自己在项目中实现功能的过程分享出来,希望对大家有些许的帮助,人非圣人,如果有不正确的地方,还烦请指正。大家平时有什么好的学习方法也可以评论区分享给我,阿里嘎多!