在我的node.js项目中,我使用了typescript。
我想从jwt.verify()
的结果中得到userId
,但我遇到了一个错误。
如何解决此问题?(如果我不使用打字稿,就没有问题。(
userService.ts文件:
在登录方法中,我有以下代码:
import jwt from "jsonwebtoken";
// I have defined userId
token = jwt.sign({ userId: userId, email: email }, secretKey, { expiresIn: expiresIn });
check-auth.ts文件:
同样在检查身份验证中间件我有:
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
问题是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
尽管对于生产代码,我会使用类似断言函数的东西来验证解码令牌的内容:
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
游乐场连接
更换
从";jsonwebtoken";;
使用
从";jsonwebtoken";;
// example,
import * as jwt from "jsonwebtoken";
let secretKey = "test";
let token = jwt.sign({ userId: "test", email: "test@test.com" },secretKey,{ expiresIn: 300000 });
const decodedToken = jwt.verify(token, secretKey);
let result = { userId: decodedToken.userId }; // I need to access to the userId
console.log(result);