Reputation: 1049
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)
~~~~~~~~~~~~~~~~~~~~~~
Upvotes: 17
Views: 14648
Reputation: 5051
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)
}
}
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);
Upvotes: 5
Reputation: 586
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!
Upvotes: 49
Reputation: 11
The problem here is that typeof process.env.JWT_SECRET is either string or undefined. So you could do:
const token = await jwt.sign({ id: newUser.id }, process.env.JWT_SECRET || "")
Upvotes: -2