【问题标题】:Getting error: FATAL ERROR: jwtPrivateKey is not defined.'出现错误:致命错误:未定义 jwtPrivateKey。
【发布时间】:2022-01-12 16:57:33
【问题描述】:

我仍然遇到一些关于 JSON Web 令牌私钥的异常错误。它说它没有定义,但我想我已经放了 JSON Web 令牌私钥并且仍然抛出错误。我不确定问题出在用户模块或身份验证模块或配置中。请参阅下面的代码,我们将不胜感激。

    //default.json
        {
        "jwtPrivateKey": "",
        "db": "mongodb://localhost/vidly"
        }
        
        // test.json
        {
        "jwtPrivateKey": "1234",
        "db": "mongodb://localhost/vidly_tests"
        }
        // config.js
        const config = require('config');
        
        module.exports = function() {
        if (!config.get('jwtPrivateKey')) {
        throw new Error('FATAL ERROR: jwtPrivateKey is not defined.');
        }
        }
        // users.js
        const auth = require('../middleware/auth');
        const jwt = require('jsonwebtoken');
        const config = require('config');
        const bcrypt = require('bcrypt');
        const _ = require('lodash');
        const {User, validate} = require('../models/user');
        const mongoose = require('mongoose');
        const express = require('express');
        const router = express.Router();
        
        router.get('/me', auth, async (req, res) => {
        const user = await User.findById(req.user._id).select('-password');
        res.send(user);
        });
        
        router.post('/', async (req, res) => {
        const { error } = validate(req.body); 
        if (error) return res.status(400).send(error.details[0].message);
        
        let user = await User.findOne({ email: req.body.email });
        if (user) return res.status(400).send('User already registered.');
        
        user = new User(_.pick(req.body, ['name', 'email', 'password']));
        const salt = await bcrypt.genSalt(10);
        user.password = await bcrypt.hash(user.password, salt);
        await user.save();
        
        const token = user.generateAuthToken();
        res.header('x-auth-token', token).send(.pick(user, ['id', 'name', 'email']));
        });
        
        module.exports = router;
        
// auth.js

const Joi = require('joi');
const bcrypt = require('bcrypt');
const _ = require('lodash');
const {User} = require('../models/user');
const mongoose = require('mongoose');
const express = require('express');
const router = express.Router();

router.post('/', async (req, res) => {
  const { error } = validate(req.body); 
  if (error) return res.status(400).send(error.details[0].message);

  let user = await User.findOne({ email: req.body.email });
  if (!user) return res.status(400).send('Invalid email or password.');

  const validPassword = await bcrypt.compare(req.body.password, user.password);
  if (!validPassword) return res.status(400).send('Invalid email or password.');

  const token = user.generateAuthToken();
  res.send(token);
});

function validate(req) {
  const schema = {
    email: Joi.string().min(5).max(255).required().email(),
    password: Joi.string().min(5).max(255).required()
  };

  return Joi.validate(req, schema);
}

module.exports = router; 


        // db.js
        const winston = require('winston');
        const mongoose = require('mongoose');
        const config = require('config');
        
        module.exports = function() {
        const db = config.get('db');
        mongoose.connect(db)
        .then(() => winston.info(Connected to ${db}...));
        }
        // logging.js
        const winston = require('winston');
        // require('winston-mongodb');
        require('express-async-errors');
        
        module.exports = function() {
        winston.handleExceptions(
        new winston.transports.Console({ colorize: true, prettyPrint: true }),
        new winston.transports.File({ filename: 'uncaughtExceptions.log' }));
        
        
        process.on('unhandledRejection', (ex) => {
        throw ex;
        });
        
        
        winston.add(winston.transports.File, { filename: 'logfile.log' });
        // winston.add(winston.transports.MongoDB, { 
        // db: 'mongodb://localhost/vidly',
        // level: 'info'
        // }); 
        
        }
        // index.js
        const winston = require('winston');
        const express = require('express');
        const app = express();
        
        require('./startup/logging')();
        require('./startup/routes')(app);
        require('./startup/db')();
        require('./startup/config')();
        require('./startup/validation')();
        
        const port = process.env.PORT || 3000;
        app.listen(port, () => winston.info(Listening on port ${port}...));
        
        // user.test.js
        const {User} = require('../../../models/user');
        const jwt = require('jsonwebtoken');
        const config = require('config');
        const mongoose = require('mongoose');
        
        describe('user.generateAuthToken', () => {
        it('should return a valid JWT', () => {
        const payload = { 
        _id: new mongoose.Types.ObjectId().toHexString(), 
        isAdmin: true 
        };
        const user = new User(payload);
        const token = user.generateAuthToken();
        const decoded = jwt.verify(token, config.get('jwtPrivateKey'));
        expect(decoded).toMatchObject(payload);
        });
        });
        
        // package.json
        
        "scripts": {
        "test": "jest --watchAll --verbose"
        },

【问题讨论】:

  • 你用config.jwtPrivateKey代替config.get('jwtPrivateKey')了吗?
  • 你能告诉我们你的项目结构吗,你的default.json和test.json在哪里?
  • default.json 和 test.json 在配置文件夹中
  • 我还加载了配置模块。 const config = require('config');
  • 我添加时已经连接:Set vidly_jwtPrivateKey=jwtPrivateKey

标签: javascript node.js authentication jwt


【解决方案1】:

您的配置文件结构错误。如果你检查https://www.npmjs.com/package/config

这是文件的结构:

{
  "Customer": {
    "dbConfig": {
      "host": "prod-db-server"
    },
    "credit": {
      "initialDays": 30
    }
  }
}

该页面也提供此信息:

config.get() 将为未定义的键抛出异常,以帮助捕获拼写错误和缺失值。使用 config.has() 测试是否定义了配置值。

【讨论】:

    【解决方案2】:

    我认为 set 不适用于 Visual Studio 代码终端。我遇到了同样的问题,当我在 Windows CMD 中执行时,它起作用了。

    【讨论】:

      【解决方案3】:

      尝试用 config.get 代替 config.has()

       module.exports = function() {
          if (!config.has('jwtPrivateKey')) {
          throw new Error('FATAL ERROR: jwtPrivateKey is not defined.');
       }
      

      【讨论】:

      • 遇到了同样的问题,这解决了它。谢谢!
      【解决方案4】:

      如果您使用 mosh 的教程,如 here 所说,您应该也有一个名为 custom-environment-variables.json 的文件,其中包含:

      {
        "jwtPrivateKey": "vidly_jwtPrivateKey"
      }
      

      那么你必须设置一个名为vidly_jwtPrivateKey的环境变量。

      在 Windows 中,您可以在 CMD 上运行:set vidly_jwtPrivateKey=mySecureKey

      希望它能解决问题:)

      【讨论】:

        【解决方案5】:

        n

        if(!config.has('jwtPrivateKey')) {
            console.error("FATAL ERROR: jwtPrivateKey not defined.")
            process.exit(1);
        }
        

        尝试使用 config.has() 而不是 config.get()

        【讨论】:

          猜你喜欢
          • 2015-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-07
          • 2017-05-19
          • 2019-03-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多