javascript - 出现错误 : FATAL ERROR: jwtPrivateKey is not defined. '

标签 javascript node.js authentication jwt

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

    //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"
        },

最佳答案

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

这是文件的结构:

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

该页面还提供了此信息:

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

关于javascript - 出现错误 : FATAL ERROR: jwtPrivateKey is not defined. ',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54569050/

相关文章:

javascript - 通过 Twilio 发送 SMS 时如何响应 promise 中的错误?

WCF session 或每次调用传递用户名/密码?

mysql - 在每次提交 creat_account 时创建不同的数据库

javascript - 具有可变字体大小的 textArea 中的对齐方式

javascript - 如何修复打开并刷新页面后自动关闭的弹出窗口?

javascript - 如何将数组元素追加到 DOM 中?

node.js - 将两个 VSTS 存储库部署到一个 Azure Web 应用

javascript - 如何使用 Passport.js 循环遍历用户并将用户列表打印到 DOM 中

php - 使用用户名而不是电子邮件的 JWTAuth 身份验证

javascript - 在 map 函数内从 Mongoose 获取文档会返回 Promise 待处理以及数据