TSlint提示atob弃用替换为Buffer.from后Node14下报错怎么解决?
报错根因
Buffer.from(data, 'base64') 返回的是Node.js的二进制Buffer对象,而JSON.parse()仅接受字符串类型的入参。原atob方法会直接返回解码后的UTF-8字符串,因此原来的代码可以正常执行,直接替换后缺少了Buffer转字符串的步骤,就会触发报错。
可行解决方案
方案1:基础修复(适配绝大多数场景)
在Buffer后调用toString()方法转为字符串即可:
return JSON.parse(Buffer.from(token.split('.')[1], "base64").toString());
方案2:兼容JWT base64url编码场景
如果你解码的是JWT的payload段,JWT使用的是base64url编码(替换了+为-、/为_,且省略了末尾的=填充位),Node14的Buffer.from默认仅支持标准base64格式,需要先做格式转换再解码:
const rawPayload = token.split('.')[1] // 转换为标准base64字符 .replace(/-/g, '+') .replace(/_/g, '/'); // 补全base64所需的填充位 const padLength = 4 - (rawPayload.length % 4); const standardBase64Payload = rawPayload.padEnd(rawPayload.length + padLength, '='); return JSON.parse(Buffer.from(standardBase64Payload, 'base64').toString());
方案3:直接忽略lint警告(Node14.16.0+版本适用)
Node.js从14.16.0版本开始已经全局支持atob/btoa方法,如果你用的小版本高于等于14.16.0,可以直接添加注释忽略tslint的弃用警告,不用改原有逻辑:
// tslint:disable-next-line: deprecation return JSON.parse(atob(token.split('.')[1]));
TS类型错误补充排查
如果你是TypeScript项目,还可能出现Buffer找不到定义的报错,安装对应版本的Node类型声明即可:
npm install @types/node@14 --save-dev
内容的提问来源于stack exchange,提问作者Rômulo Sorato
相关产品推荐
相关产品推荐

