JS生成含大小写符号数字的强密码脚本在Zapier报只读属性错误如何解决
错误根因
你碰到的报错和你给generateP.property1设置可写属性完全无关,问题出在shuffle函数的入参类型错误:
JavaScript的字符串是不可变原始类型,无法通过下标直接修改某一位的字符。你生成的pass是字符串类型,直接传给shuffle函数后,函数里的交换操作[array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]]尝试修改字符串的索引属性,就触发了只读属性无法赋值的报错。
修复步骤
- 调用
shuffle前先把密码字符串转为数组,打乱后再转回字符串即可 - 额外优化:循环条件
i <= length会导致生成的密码比预期多1位,建议改为i < length - 适配Zapier环境:Zapier是服务端运行环境,没有浏览器的
alert方法,需把alert调用改为return返回生成的密码,避免触发额外报错
修复后完整代码
function getRandomChar(str) { return str.charAt(Math.floor(Math.random() * str.length)); } function shuffle(array) { var currentIndex = array.length, randomIndex; while (currentIndex != 0) { randomIndex = Math.floor(Math.random() * currentIndex); currentIndex--; [array[currentIndex], array[randomIndex]] = [ array[randomIndex], array[currentIndex]]; } return array; } function generatePHelper(groups, length) { return function() { let pass = groups.map(getRandomChar).join(''); const str = groups.join(''); // 修正循环条件,避免多生成1位 for (let i = pass.length; i < length; i++) { pass += getRandomChar(str) } // 字符串转数组传入shuffle,处理完再转回字符串 return shuffle(pass.split('')).join(''); }; } const groups = [ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz', '1234567890', '!@#$%^&()_+~`|}{[]:;?><,./-=' ]; const generateP = {}; Object.defineProperty(generateP, 'property1', { writable: true, value: generatePHelper(groups, 16) }); // 适配Zapier环境,返回结果替代alert return generateP.property1();
内容的提问来源于stack exchange,提问作者bb bb
相关产品推荐
相关产品推荐

