【问题标题】:use ENV variable inside jwt sign在 jwt 符号内使用 ENV 变量
【发布时间】:2021-04-12 22:12:30
【问题描述】:

我在我的系统中使用 JWT,它工作得很好,我为我的 SecretKey 使用常规字符串这是工作代码

export class CompanyResolver {

  @Query(() => [Company])
  companies() {
    return Company.find();
  }

  @Query(() => Company)
  async login(
    @Arg("email") email: string,
    @Arg("password") password: string,
  ): Promise<Company | null> {
    const company = await Company.findOne({ where: { email } });

    if (!company)
      throw new Error("Company Not Found!!!");

    if (!await bcrypt.compare(password, company.password))
      throw new Error("Incorrect Password!!!");

    const secret=process.env.JWT_SECRET;  

    console.log(secret)

     company.accessToken = jsonwebtoken.sign({ company }, "12345", {
       expiresIn: "30 days"
     })
    return company;
  }

我在我的 env 文件中定义了我的秘密,该文件在执行 console.log(process.env.JWT_SECRET) 时 确实把我的钥匙还给了我,这意味着没有问题,但是问题是当我尝试使用它时

company.accessToken = jsonwebtoken.sign({ company }, secret, {
           expiresIn: "30 days"
         })

我明白了

Type 'undefined' is not assignable to type 'Secret'.

我是 nodejs 和 TS 的新手,对于任何幼稚的错误,我提前道歉,有人可以指出问题吗?

【问题讨论】:

    标签: node.js typescript jwt typegraphql


    【解决方案1】:

    process.env 值类型为string | undefined。这意味着 Typescript 不保证每个 process.env.MY_ENV_VAR 都必须返回字符串类型。如果没有设置环境变量,它可能会返回undefined,所以请注意。

    在这种情况下,这样的事情应该会有所帮助

    if(secret){
      company.accessToken = jsonwebtoken.sign({ company }, secret, {
               expiresIn: "30 days"
             })
    } else {
      // Handle the case where the variable is not set, may be throw exception
    }
    

    【讨论】:

    • 与其他编程语言相比,这是不寻常的,但绝对是 TS 的一个很好的检查,以处理未定义的错误,以防出现错误
    • @uneebmeer 这是一个运行时错误,TS 无法捕捉到它。见stackoverflow.com/questions/58562164/…
    猜你喜欢
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 2012-05-17
    相关资源
    最近更新 更多