【问题标题】:Error: secretOrPrivateKey must have a value错误:secretOrPrivateKey 必须有值
【发布时间】:2020-02-28 14:08:21
【问题描述】:

我正在使用 jwt 创建令牌,但是当我通过邮递员登录时,我从控制台收到错误“错误:secretOrPrivateKey 必须具有值”。我附上了我的登录代码。请任何可以帮助我的人

exports.login = (req, res, next) => {
  User.findOne({
    where: {
      email: req.body.email
    }
  })
    .then(user => {
      if (!user) {
        return res.status(401).json({
          message:
            "Auth failed!! either the account does't exist or you entered a wrong account"
        });
      }
      bcrypt.compare(req.body.password, user.password, (err, result) => {
        if (err) {
          return res.status(401).json({
            message: "Auth failed",
            token: token
          });
        }
        if (result) {
          const token = jwt.sign(
            {
              email: user.email,
              password: user.id
            },
            process.env.JWT_KEY,
            {
              expiresIn: "1h"
            }
          );

          res.status(200).json({
            message: "Auth granted, welcome!",
            token: token
          });
        }
      });
    })
    .catch(err => {
      console.log(err);
      res.status(500).json({
        error: err
      });
    });
};

这是我的 env.json 文件

{
    "env":{
        "MYSQL":"jllgshllWEUJHGHYJkjsfjds90",
        "JWT_KEY": "secret"
    }
}

【问题讨论】:

    标签: mysql node.js express


    【解决方案1】:

    您的应用程序似乎无法正确读取环境变量。

    我不知道您使用哪个包来加载环境变量,但最简单的方法是使用 dotenv 包。

    使用 npm i dotenv 安装后,尽早将其导入应用程序主文件,如下所示:

    require("dotenv").config();
    

    在您的应用程序根文件夹中使用此内容创建 .env 文件(如您所见,格式为 key=value)

    MYSQL=jllgshllWEUJHGHYJkjsfjds90
    JWT_KEY=secret
    

    然后您可以像以前一样访问它们的值:

    process.env.JWT_KEY
    

    .env 文件:

    【讨论】:

    • 我已经安装了 dotenv 并且需要作为您对我的评论,但我仍然收到相同的错误,请参阅我上传到上一个问题的屏幕截图
    • @mchomvu 您是否也在根文件夹中创建了 .env 文件?
    • @mchomvu 我添加了一个屏幕截图来显示 .env 文件的格式。
    • 最后需要("dotenv").config();必须在主文件的第一行(如 index.js 或 app.js)
    • 是的,我创建了一个 env 文件,但作为 json 文件,该格式是否正确?
    【解决方案2】:

    删除 process.env.JWT_SECRET_KEY 并这样做:${process.env.JWT_SECRET_KEY} 用反引号括起来。 它为我解决了这个问题。

    【讨论】:

    • 谢谢。这对我有用。如果你的 .env 文件是正确的并且你使用了@nest/config,请使用这个解决方案。
    • @elonaire 在使用@nestjs/config 时,您应该使用ConfigService,请参阅我的回复。
    • 谢谢!你拯救了我的一天!
    【解决方案3】:

    只有当我将它与这样的空字符串连接时它才对我有用:

    "" + process.env.JWT_KEY
    

    【讨论】:

      【解决方案4】:

      在尝试依赖 process.env.X 时,NestJS 遇到了这个问题。据说@nestjs/config 在后台使用dotenv,但它没有按预期工作。我要么必须使用ConfigService,要么在给定文件中显式配置dotenv

      jwt.strategy.ts

      import * as dotenv from 'dotenv';
      dotenv.config();
      
      @Injectable()
      export class JwtStrategy extends PassportStrategy(Strategy) {
        constructor() {
          super({
            secretOrKey: process.env.JWT_SECRET,
          });
        }
      }
      

      @Injectable()
      export class JwtStrategy extends PassportStrategy(Strategy) {
        constructor(configService: ConfigService) {
          super({
            secretOrKey: configService.get<string>('JWT_SECRET'),
          });
        }
      }
      

      auth.module.ts

      import * as dotenv from 'dotenv';
      dotenv.config();
      
      @Module({
        imports: [
          JwtModule.register({
            secret: process.env.JWT_SECRET,
          }),
        ],
      })
      

      @Module({
        imports: [
          JwtModule.registerAsync({
            imports: [ConfigModule]
            useFactory: async (configService: ConfigService) => {
              return {
                secret: configService.get<string>('JWT_SECRET'),
              };
            },
            inject: [ConfigService],
          }),
        ],
      })
      

      【讨论】:

      • 这救了我的命,谢谢。
      【解决方案5】:

      只需删除 process.env.JWT_KEY 并替换为“使用”ES6 字符串文字的“密钥”

      ${process.env.JWT_SECRET_KEY}

      它为我解决了这个问题

      【讨论】:

        【解决方案6】:

        您确定process.env.JWT_KEY 的值有效吗?我相信是undefinednull

        【讨论】:

        • console.log这个值了吗?
        【解决方案7】:

        将 require('dotenv').config() 放在 server.js 文件的顶部 这为我解决了

        【讨论】:

          【解决方案8】:

          你可以试试这个,它对我有用。 "" + process.env.JWT_KEY

          【讨论】:

            【解决方案9】:

            我只是删除了 process.env.JWT_KEY 并替换为“secret”并且它工作正常。

            【讨论】:

            • 不要那样做!秘密有这个名字是有原因的。一旦你将它提交到 repo,它就不再是秘密了。
            【解决方案10】:
            1. 只需添加反引号 `` 并在其中使用语法 ${process.env.SECRET_KEY}
            2. 我还建议您使用 cross-env 包,安装后您可以使用环境变量 .development.env 和 .production.env 制作两个文件

            要配置cross-env,只需将其粘贴到package.json "scripts" 字段中:

            "start": "cross-env NODE_ENV = production nest start",
            "start:dev": "cross-env NODE_ENV = development nest start --watch"
            

            它是给nestjs的

            【讨论】:

              【解决方案11】:

              为了解决这个问题,我发现这个错误是由我尝试使用的密钥的内容引起的。我经常为此类字符串使用“密码生成器”,它为我提供了以下使用方法:

              we@?T,c'=+kxT?euCP27R/D=uRm893$=^_h^f={ c.)MD#[%zg}$K8_D#D-_/tb2?Q>RFr(}H:Fp#{&yNFt@2Y

              如果将上述内容放在反引号或语音标记之间,则无法将其解析为字符串,因此会导致上述错误。

              作为额外的调试级别,请确保首先将密钥包含在反引号或括号中,以确保不存在无法解析的字符串。

              【讨论】:

                【解决方案12】:

                您也可以尝试使用属性指定一个对象,该属性是配置文件的路径,例如 require("dotenv").config({path: '/path_to_env_file'});

                【讨论】:

                  【解决方案13】:

                  使用上面的代码(图片)来解决你的问题。

                  【讨论】:

                  • 不要那样做!秘密有这个名字是有原因的。一旦你将它提交到 repo,它就不再是秘密了。
                  猜你喜欢
                  • 2022-06-18
                  • 2019-02-23
                  • 2022-10-23
                  • 2021-01-17
                  • 1970-01-01
                  • 2016-08-12
                  • 2014-10-21
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多