Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JWT: Argument of type 'string | undefined' is not assignable to parameter of type 'Secret'

I'm using dotenv to declare JWT_SECRET env variable and It's showing the error mentioned in title.

.env

NODE_ENV="development"
JWT_SECRET="mySecretString"

environment.d.ts

import { Secret } from 'jwt-promisify'

declare global {
    namespace NodeJS {
        interface ProcessEnv {
            JWT_SECRET: Secret,
            NODE_ENV: 'development' | 'production',
            PORT?: number | string
        }
    }
}

export {}

I'm using in my routes file im signing token with JWT_SECRET

route.ts

const token = await jwt.sign({ id: newUser.id }, process.env.JWT_SECRET)

Here intellisense is working but when I run the app or compile it the error appears.

error

error TS2345: Argument of type 'string | undefined' is not assignable to parameter of type 'Secret'.
  Type 'undefined' is not assignable to type 'Secret'.

32         const token = await jwt.sign({ id: newUser.id }, process.env.JWT_SECRET)
                                                            ~~~~~~~~~~~~~~~~~~~~~~

like image 351
Swapnil Soni Avatar asked Dec 18 '22 11:12

Swapnil Soni


2 Answers

  jwt.sign(data, process.env.SIGNATURE_KEY as string, {
        expiresIn: '30d',
        algorithm: "HS256"
    }, (err, encoded)=>{
        err ? reject(err) : resolve(encoded)
    })

For Typescript, I think Type casting works. I also didn't implement async-await because the sign method wasn't hinted as a Promise. But I guess it works too!

like image 112
Devmaleeq Avatar answered Dec 20 '22 17:12

Devmaleeq


First solution

just use ! right after process.env.JWT_KEY actually, exclamation (!) says, hey typescript, don't worry, don't check this.

const userJwt = jwt.sign({
   id: newUser.id 
}, process.env.JWT_KEY!);

And in the startup project(index.ts), when I want to load the database config, etc add the below condition

‍‍‍//index.ts
const start = async () => {
  try {
    if(!process.env.JWT_KEY){
      throw new Error('JWT_KEY must be defined')
    }
    //Connect to database or ...
  } catch (error) {
    console.log(error)
  }
}

Second solution

Because if you check the JWT_KEY before using jwt.sign like the below code, the problem will be solved without using ! after process.env.JWT_KEY, but the first solution is better

if(!process.env.JWT_KEY){
  throw new Error('JWT_KEY must be defined')
}
const userJwt = jwt.sign({
  id: user.id,
}, process.env.JWT_KEY);
like image 38
Mohammad Yaser Ahmadi Avatar answered Dec 20 '22 17:12

Mohammad Yaser Ahmadi