如何从已创建的 jwt.verify() 方法的结果中获取属性

Jah*_*han 3 node.js express jwt typescript

在我的 Node.js 项目中,我使用了 TypeScript。

我想得到userId结果,jwt.verify()但我得到了一个错误。

我该如何解决这个问题?(如果我不使用 typescript,就没有问题。)

userService.ts 文件:

在登录方法中我有以下代码:

import jwt from "jsonwebtoken"; 

// I have defined userId
token = jwt.sign({ userId: userId, email: email }, secretKey, { expiresIn: expiresIn });
Run Code Online (Sandbox Code Playgroud)

检查 auth.ts 文件:

另外在 check-auth 中间件中我有:

 import jwt from "jsonwebtoken";


 const decodedToken = jwt.verify(token, process.env.SECRET_KEY);

 // Property 'userId' does not exist on type 'string | object'.
 // Property 'userId' does not exist on type 'string'.ts(2339)

 req.userData = { userId: decodedToken.userId }; // I need to access to the userId
Run Code Online (Sandbox Code Playgroud)

ale*_*xor 8

问题是jwt.verify不知道编码token字符串内可能有什么。事实上,任何东西都可能是用正确的密钥签名的。所以你必须提示 TS 期望的类型。作为最快速的解决方案:

type MyToken = {
  userId: string
  email: string
  iat: number
  exp: number
}

const decodedToken = jwt.verify(token, process.env.SECRET_KEY) as MyToken;

req.userData = { userId: decodedToken.userId }; // ok
Run Code Online (Sandbox Code Playgroud)

尽管对于生产代码,我会使用断言函数之类的东西来验证解码令牌的内容:

type MyToken = {
  userId: string
  email: string
  iat: number
  exp: number
}

const decodedToken: unknown = jwt.verify(token, process.env.SECRET_KEY);

function verifyDecodedToken(data: unknown): asserts data is MyToken {
  if (!(data instanceof Object)) 
    throw new Error('Decoded token error. Token must be an object');
  if (!('userId' in data)) 
    throw new Error('Decoded token error. Missing required field "userId"');

  // other necessary checks
}

verifyDecodedToken(decodedToken);

req.userData = { userId: decodedToken.userId }; // ok
Run Code Online (Sandbox Code Playgroud)

游乐场链接