JWT:'string | 类型的参数undefined' 不可分配给'Secret' 类型的参数
Posted
技术标签:
【中文标题】JWT:\'string | 类型的参数undefined\' 不可分配给\'Secret\' 类型的参数【英文标题】:JWT: Argument of type 'string | undefined' is not assignable to parameter of type 'Secret'JWT:'string | 类型的参数undefined' 不可分配给'Secret' 类型的参数 【发布时间】:2021-05-25 10:42:55 【问题描述】:我正在使用 dotenv 声明 JWT_SECRET 环境变量,它显示了标题中提到的错误。
.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
我在路由文件中使用 JWT_SECRET
签名令牌
route.ts
const token = await jwt.sign( id: newUser.id , process.env.JWT_SECRET)
这里的智能感知正在工作,但是当我运行应用程序或编译它时出现错误。
错误
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)
~~~~~~~~~~~~~~~~~~~~~~
【问题讨论】:
你在文件顶部使用import dotenv from 'dotenv' dotenv.config()
吗?
是的,我在 app.ts 中使用它
我认为你应该在每个你想使用的文件中使用process.env
我不这么认为,因为当我在以前的项目中使用 Node.js 时,我只需要 app.js
中的 dotenv,然后它也可以与其他文件一起使用
【参考方案1】:
jwt.sign(data, process.env.SIGNATURE_KEY as string,
expiresIn: '30d',
algorithm: "HS256"
, (err, encoded)=>
err ? reject(err) : resolve(encoded)
)
对于 Typescript,我认为类型转换有效。我也没有实现异步等待,因为签名方法没有被暗示为Promise
。但我想它也有效!
【讨论】:
【参考方案2】:这里的问题是 typeof process.env.JWT_SECRET 要么是字符串要么是未定义的。 所以你可以这样做:
const token = await jwt.sign( id: newUser.id , process.env.JWT_SECRET || "")
【讨论】:
您是否认真建议使用空(或任何其他硬编码)字符串进行签名? 我只是指出问题所在,他可以随心所欲地管理它。无论如何,也请添加您的建议以上是关于JWT:'string | 类型的参数undefined' 不可分配给'Secret' 类型的参数的主要内容,如果未能解决你的问题,请参考以下文章
JWT 库错误:通用类型“ModuleWithProviders<T>”需要 Angular 10 中的 1 个类型参数