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' 类型的参数的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript基础知识

无法创建“System.String”类型的实例

01_基础总结深入

JWT 库错误:通用类型“ModuleWithProviders<T>”需要 Angular 10 中的 1 个类型参数

TypeScript教程# 4:TS中类型

为啥验证函数中的令牌参数在 jwt 身份验证中显示错误?