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." }); };
原因分析
- 环境变量未加载:使用
process.env.JWT_SECRET但未加载dotenv模块,Node.js无法读取.env文件中的环境变量,导致jwtConfig.secret为undefined,调用jwt.sign时触发错误。 - 控制器模块缺失:
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
相关产品推荐
相关产品推荐

