我试图用jwt-decode解码我的令牌,但我不能。它给了我以下错误。有谁知道为什么?
错误错误:未捕获(在承诺中):TypeError:jwt_decode_1.default是 不是函数TypeError:jwt_decode_1.default不是函数 在RoleGuardService.canActivate(role-guard.service.ts?d7c4:19)
import jwt_decode from 'jwt-decode';
canActivate(route: ActivatedRouteSnapshot): boolean {
// this will be passed from the route config
// on the data property
const expectedRole = route.data.expectedRole;
const token = localStorage.getItem('token');
// decode the token to get its payload
const tokenPayload = jwt_decode(token);
console.log(tokenPayload);
if (
!this.auth.isAuthenticated() ||
tokenPayload.role !== expectedRole
) {
this.router.navigate(['login']);
return false;
}
return true;
}
答案 0 :(得分:14)
我认为你应该像这样导入它:
import * as jwt_decode from 'jwt-decode';
答案 1 :(得分:5)
根据documentation +互联网搜索,正确的方法是:
1。安装软件包和类型
npm install --save jwt-decode
npm install --save @types/jwt-decode
// @ts-ignore import jwt_decode from "jwt-decode";
您还可以在tsconfig.json上添加该规则,但有一次例外:)
答案 2 :(得分:1)
我有同样的错误,但是经过多次尝试,我确实设法通过使用另一种方法解决了这个问题:
private decode(token: string) {
try {
return JSON.parse(atob(token.split(".")[1]));
} catch (e) {
console.log("error decoding token");
}
}
function atob()references
答案 3 :(得分:1)
jwt_decode 一直是一个 CommonJS 模块,通常以 const jwt_decode = require('jwt-decode');
的形式导入,这是 Node.js 使用的。
使用 JS import
语句导入 CommonJS 库的方式是 import * as library-name from 'library-name;
。
像 Angular 10 这样的现代框架在使用具有 CommonJS 格式的包时会发出警告,因为它们通常不能被摇树。
此库的第 3 版(现在处于测试阶段)包含更现代的 ESM 构建,这正是 JS 导入语句的用途,因此可以使用 import jwt_decode from 'jwt-decode';
以常规方式导入现代 ESM 包。这是一个重大更改,因此我创建了一个新的主要版本 3
。
我们仍然有一个 CommonJS 构建,但默认情况下,大多数现代 Web 构建系统(不是节点)将使用 ESM 构建。
如果您在安装 lib 时签出 package.json
文件,您会注意到其中有两个版本。
{
...
"main": "build/jwt-decode.cjs.js",
"module": "build/jwt-decode.esm.js",
...
}