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)
问题是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)
| 归档时间: |
|
| 查看次数: |
4412 次 |
| 最近记录: |