Node.js中使用google tink报ReferenceError: self is not defined求助
解决方案
问题根因
tink-crypto官方npm包默认优先适配浏览器环境,其UMD产物代码中直接引用了浏览器端全局对象的别名self,而Node.js v12环境下的全局对象为global,不存在self变量,因此导入库时直接抛出未定义错误。
可行解决方案
方案1:全局注入self变量(最简便,改造成本最低)
在项目入口文件的最顶部添加如下代码,在引入tink-crypto之前先完成全局变量注入:
// 注入浏览器端self变量别名到Node.js全局对象 global.self = global;
修改后的完整可运行示例代码如下:
// 入口第一行先执行全局变量注入 global.self = global; const tinkLoader = () => import("tink-crypto"); tinkLoader().then((tink) => { tink.hybrid.register(); // Node.js环境替换浏览器atob方法为原生Buffer实现 const keyBase64 = resource_response.data.encoded_key; const keyBinaryStr = Buffer.from(keyBase64, 'base64').toString('binary'); const keyset = stringToUint8Array(keyBinaryStr); tink.binary .deserializeNoSecretKeyset(keyset) .getPrimitive(tink.hybrid.HybridEncrypt) .then((hybridEncrypt) => { // 后续业务逻辑 }); });
方案2:无全局污染的局部注入
如果担心全局变量注入会影响其他业务逻辑,可以通过Node.js的vm模块或者自定义模块加载钩子实现仅在加载tink-crypto时注入self变量,普通业务场景下方案1的兼容性和稳定性已经足够使用。
额外注意事项
Node.js v16及以上版本已经原生支持全局self变量,如果后续有升级Node.js版本的计划,升级后可以直接移除注入代码正常使用tink-crypto包。
内容的提问来源于stack exchange,提问作者Vict
相关产品推荐
相关产品推荐

