secretOrPrivateKey必须具有一个值

时间:2018-09-19 18:28:51

标签: node.js mongoose jwt

我正在尝试学习nodejs并使用jwt为用户创建令牌。但是我在服务器端遇到此错误:secretOrPrivateKey must have a value。这是很多代码,所以我将给出我认为重要的信息(让我知道是否需要其他东西):

user.js:

const config = require('./../config/config').get(process.env.NODE_ENV);
...
userSchema.methods.generateToken = function(callback) {
    console.log(config.SECRET); // THIS IS UNDEFINED
    var token = jwt.sign(this._id.toHexString(), config.SECRET);

    this.token = token;
    this.save(function(err, user) {
        if (err) return callback(err);
        callback(null, user)
    });
}

server.js:

app.post('/api/login', (req, res) => {
    User.findOne({'email': req.body.email}, (err, user) => {
        ...    
        user.generateToken((err, user) => {
            if (err) return res.status(400).send(err);

            res.cookie('auth', user.token).json({
                isAuth: true,
                id: user._id
            })
        })
    })
})

config.js:

const config = {
    production: {
        SECRET: process.env.SECRET,
        DATABASE: process.env.MONGODB_URI
    },
    default: {
        SECRET: 'SUPER_SECRET-PASSWORD!123?',
        DATABASE: 'mongodb://localhost:27017/feedback'
    }
}

exports.get = function get(env) {
    return config[env] || config.default
}

3 个答案:

答案 0 :(得分:2)

我认为您对节点的调用可能是错误的。尝试使用节点server.js,您将获得默认配置。您还可以将console.log放在exports.get()中,以查看它作为环境变量发送的内容。

答案 1 :(得分:0)

我认为您的配置有问题。您唯一导出的是函数get。所以config.SECRET为空。你应该写config.get()。SECRET

答案 2 :(得分:0)

就我而言,我具有此文件夹结构。

  • 项目

    • 前端

    • 后端

      • index.js
      • .env

我遇到错误“ secretOrPrivateKey必须具有值”,因为终端在Project文件夹中,并且我运行了nodemon backend/index.js。我不在使用.env文件运行的正确文件夹中。 cd backend && nodemon index.js有帮助