控制台抛出TypeError: Cannot read property '0' of null错误,请求排查
搞定TypeError: Cannot read property '0' of null的问题
我一看这个错误就知道咋回事了——你在master.js第24行尝试读取out.addresses[0],但某个out对象的addresses属性是null,JS自然就炸了。先帮你理清楚来龙去脉:
问题重现
你遇到的错误日志:
TypeError: Cannot read property '0' of null at app.post (/root/src/master.js:24:29)
对应的代码段:
let outputs = req.body.outputs; let outs = []; for (let out of outputs) { outs.push({ address: out.addresses[0], value: out.value }) }
正常的请求outputs结构是这样的:
"outputs": [ { "value": 10000, "script": "a91402f42dce015def2fab0b1d6f7f6c742bae66e75e87", "addresses": [ "31xdnmzVzmAQ5CaWxtiDr3jwCFfeUpHEb1" ], "script_type": "pay-..." } ]
错误根源
没错,就是某个输出项的addresses字段是null。JS里null不是数组,你硬要读它的[0]索引,肯定会抛出类型错误。这种情况大概率是请求里混进了不符合格式的输出项,比如有些outputs元素没带addresses数组,或者直接给了null。
几种修复方案
根据你的需求选就行:
1. 用可选链快速解决(推荐,ES2020+支持)
直接用?.操作符,当addresses为null/undefined时,表达式会返回undefined,不会报错:
let outputs = req.body.outputs; let outs = []; for (let out of outputs) { outs.push({ address: out.addresses?.[0], value: out.value }) }
2. 手动判断兼容旧环境
如果你的Node.js版本比较老,不支持可选链,就手动加校验:
let outputs = req.body.outputs; let outs = []; for (let out of outputs) { // 先确认addresses是数组,再取第一个元素,否则设为null/undefined const address = Array.isArray(out.addresses) ? out.addresses[0] : null; outs.push({ address, value: out.value }) }
3. 直接跳过无效项
如果那些没有有效addresses的输出项是没用的,直接过滤掉就行:
let outputs = req.body.outputs; let outs = []; for (let out of outputs) { // 只有当addresses是数组且有元素时才加入结果 if (Array.isArray(out.addresses) && out.addresses.length > 0) { outs.push({ address: out.addresses[0], value: out.value }) } }
额外提醒
为了从源头避免这种问题,建议你在接收请求时做严格的参数校验,比如用joi或者zod这类库,定义outputs每个元素必须包含非空的addresses数组,这样无效请求直接就被拦截了,不用到业务代码里再处理。
内容的提问来源于stack exchange,提问作者Gaben Lounge
相关产品推荐
相关产品推荐

