You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express使用crypto-js加密数据报CryptoJS未定义错误

问题原因

你遇到的两个报错是连锁触发的:

  1. 核心错误是变量名大小写不匹配:导入crypto-js依赖时你定义的变量名是小写开头的cryptoJS,但调用加密、解密方法时写的是大写开头的CryptoJS。Node.js对变量名大小写严格敏感,运行时找不到CryptoJS这个变量直接抛出引用错误。
  2. Express捕获到这个运行时错误后,默认返回HTML格式的错误页,前端代码预期接收JSON响应,解析到HTML开头的<!DOCTYPE html>里的<字符时,就抛出了SyntaxError: Unexpected token < in JSON at position 0的解析错误。

移除加密相关代码后,不存在错误的变量调用,接口正常返回JSON,所以不会报错。

修复方案
  1. 统一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);
    
  2. 修复加密结果存储问题:CryptoJS.AES.encrypt()返回的是对象类型,直接拼接到SQL字符串里会被转成[object Object]存入数据库,存库前必须调用.toString()转成密文字符串。
  3. 替换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);
    });
    
  4. 补全校验分支的响应:当前用户名不合法、用户名长度不足、两次密码不一致的分支只打印了日志,没有给前端返回任何响应,会导致前端请求一直挂起,需要给这些分支补充对应的错误返回逻辑。

内容的提问来源于stack exchange,提问作者FBK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 03:45:35