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

Node.js+MongoDB认证项目登录报错:secretOrPrivateKey must have a value

登录时JWT报错:secretOrPrivateKey must have a value 排查与解决

错误信息

E:\IMPORTANT\INFO-DEV\DEV\ANGULAR NODEJS\SYSTEM MANAGEMENT\backend\node_modules\jsonwebtoken\sign.js:107
    return failure(new Error('secretOrPrivateKey must have a value'));
                   ^

Error: secretOrPrivateKey must have a value
    at module.exports [as sign] (E:\IMPORTANT\INFO-DEV\DEV\ANGULAR NODEJS\SYSTEM MANAGEMENT\backend\node_modules\jsonwebtoken\sign.js:107:20)
    at exports.createToken (E:\IMPORTANT\INFO-DEV\DEV\ANGULAR NODEJS\SYSTEM MANAGEMENT\backend\utils\jwt.js:8:37)      
    at exports.login (E:\IMPORTANT\INFO-DEV\DEV\ANGULAR NODEJS\SYSTEM MANAGEMENT\backend\controllers\auth.controller.js:34:25)

Node.js v18.12.0
[nodemon] app crashed - waiting for file changes before starting...

相关代码片段

JWT配置文件(config/jwt.js)

module.exports = { 
    secret: process.env.JWT_SECRET,
    ttl: 3600
}

JWT工具类(utils/jwt.js)

const jwt = require("jsonwebtoken");
const jwtConfig = require("../config/jwt");

exports.verifyToken = (token) => jwt.verify(token, jwtConfig.secret);

exports.createToken = (data) =>
  jwt.sign(data, jwtConfig.secret, { expiresIn: jwtConfig.ttl });

.env文件

PORT=3000
MONGODB_URI=mongodb://127.0.0.1:27017
DB_NAME=inflouis
JWT_SECRET=inflouis
ttl=3600

登录控制器(controllers/auth.controller.js)

const User = require("../models/user");
const jwt = require("../utils/jwt");
const bcrypt = require("bcrypt");

exports.login = async (req, res) => {
  const user = await User.findOne({
    email: req.body.email,
  });
  if (user) {
    const isMatched = await bcrypt.compare(req.body.password, user.password);
    if (isMatched) {
      const token = jwt.createToken({ _id: user._id });
      return res.json({
        access_token: token,
        token_type: "Bearer",
        expires_in: jwtConfig.ttl,
      });
    }
  }
  return res.status(400).json({ message: "Invalid credentails." });
};

原因分析

  1. 环境变量未加载:使用process.env.JWT_SECRET但未加载dotenv模块,Node.js无法读取.env文件中的环境变量,导致jwtConfig.secret为undefined,调用jwt.sign时触发错误。
  2. 控制器模块缺失:auth.controller.js中直接使用jwtConfig.ttl但未导入该配置模块,后续即使环境变量加载成功,此处也会报jwtConfig is not defined错误。

解决方案

步骤1:安装dotenv模块

在项目根目录执行:

npm install dotenv

步骤2:在入口文件加载dotenv

找到项目入口文件(通常为app.js或server.js),在文件最顶部添加:

require('dotenv').config();

步骤3:修复控制器的模块导入问题

修改auth.controller.js,新增jwtConfig模块导入:

const User = require("../models/user");
const jwt = require("../utils/jwt");
const bcrypt = require("bcrypt");
const jwtConfig = require("../config/jwt"); // 新增这行

exports.login = async (req, res) => {
  const user = await User.findOne({
    email: req.body.email,
  });
  if (user) {
    const isMatched = await bcrypt.compare(req.body.password, user.password);
    if (isMatched) {
      const token = jwt.createToken({ _id: user._id });
      return res.json({
        access_token: token,
        token_type: "Bearer",
        expires_in: jwtConfig.ttl,
      });
    }
  }
  return res.status(400).json({ message: "Invalid credentails." });
};

完成以上步骤后重启项目,登录功能即可正常生成JWT令牌。

内容的提问来源于stack exchange,提问作者Stéphane Konan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:15:42