ウェブサイト検索

node.js - jwtサイン内でENV変数を使用する


私はシステムで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'.

私はNode.jsとTypeScriptの初心者です。子供じみたミスがあった場合は事前にお詫びします。どなたか問題を指摘してもらえますか?

回答 #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
}

回答 #2

「!」を使用して、タイプスクリプトに「secret」が確実に存在することを認識させるために、明確な代入アサーションを使用することもできます。上記の回答が述べているように、process.env の型は string | undefined であり、これは jwt.Secret にとって無効な型です。

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