Express使用crypto-js加密数据报CryptoJS未定义错误
问题原因
你遇到的两个报错是连锁触发的:
- 核心错误是变量名大小写不匹配:导入
crypto-js依赖时你定义的变量名是小写开头的cryptoJS,但调用加密、解密方法时写的是大写开头的CryptoJS。Node.js对变量名大小写严格敏感,运行时找不到CryptoJS这个变量直接抛出引用错误。 - Express捕获到这个运行时错误后,默认返回HTML格式的错误页,前端代码预期接收JSON响应,解析到HTML开头的
<!DOCTYPE html>里的<字符时,就抛出了SyntaxError: Unexpected token < in JSON at position 0的解析错误。
移除加密相关代码后,不存在错误的变量调用,接口正常返回JSON,所以不会报错。
修复方案
- 统一crypto-js的变量名,两种改法选一种即可:
- 改导入行,和后续调用的大写命名保持一致:
// 原代码是var cryptoJS = require('crypto-js'); 改成下面这行 var CryptoJS = require('crypto-js');- 或者改后续调用的代码,和导入时的小写命名保持一致:
var data = cryptoJS.AES.encrypt(password, key); var decrypted = cryptoJS.AES.decrypt(data, key).toString(cryptoJS.enc.Utf8); - 修复加密结果存储问题:
CryptoJS.AES.encrypt()返回的是对象类型,直接拼接到SQL字符串里会被转成[object Object]存入数据库,存库前必须调用.toString()转成密文字符串。 - 替换SQL拼接写法,避免SQL注入风险:不要直接把用户输入拼到SQL语句里,用mysql模块支持的参数化查询写法:
let sqlInsert = "INSERT INTO `users` ( `username`, `email`, `password`, `date` ) VALUES (?, ?, ?, ?)"; pool.query(sqlInsert, [user, email, data.toString(), today], function (eroare, insertul, fields) { if (eroare) throw eroare; const results = { user: user, email: email } res.json(results); }); - 补全校验分支的响应:当前用户名不合法、用户名长度不足、两次密码不一致的分支只打印了日志,没有给前端返回任何响应,会导致前端请求一直挂起,需要给这些分支补充对应的错误返回逻辑。
内容的提问来源于stack exchange,提问作者FBK
相关产品推荐
相关产品推荐

