1、Cannot read properties of null (reading 'getBytes')
具体使用方式为
import EC from 'elliptic/lib/elliptic/ec';
const ec = new EC('p256'); // 选择椭圆曲线secp256k1的别名是p256
const aliceKeyPair = ec.genKeyPair();
增加log后发现问题产生原因在const aliceKeyPair = ec.genKeyPair();函数。故进行了进一步的排查找到node_modules/elliptic/lib/elliptic/ec/index.js路径下的EC.prototype.genKeyPair = function genKeyPair(options) 函数后发现问题在于var brorand = require('brorand');这个库的引入,这里我因为调试更改了引入后的名称注意分辨。
同时注意brorand的路径应该为node_modules/brorand/index.js而非Microsoft/TypeScript/5.2/node_modules/@types/brorand/index.d.ts因为这个路径问题多调试了两个小时各种分析。
var drbg = new HmacDRBG({
hash: this.hash,
pers: options.pers,
persEnc: options.persEnc || 'utf8',
entropy: options.entropy || brorand(this.hash.hmacStrength),
entropyEnc: options.entropy && options.entropyEnc || 'utf8',
nonce: this.n.toArray(),
});
在node_modules/brorand/index.js中存在
c
function Rand(rand) {
this.rand = rand;
}
而elliptic/lib/elliptic/ec/index.js在调用时似乎并未传入对应的rand随机数生成函数。所以产生了Cannot read properties of null (reading 'getBytes')问题。
解决方案为将node_modules/brorand/index.js中的Rand替换为以下代码即可正常使用。
c
const customRand = {
getBytes: function(n) {
const arr = new Uint8Array(n);
// 自定义随机数生成逻辑(例如使用 Math.random(),但不推荐用于加密)
for (let i = 0; i < n; i++) {
arr[i] = Math.floor(Math.random() * 256);
}
return arr;
}
};
function Rand(rand) {
this.rand = customRand;
}
这部分内容在修改完成后需要把微信开发者工具完全关闭后再重新打开才会生效。包的修改都需要进行这个操作。
但是我也不知道是否应该在node_modules中直接进行修改这样子不会导致后续包更新导致修改被覆盖或者其他问题嘛?欢迎懂的大佬在评论区交流一下。我是小程序新手。