Node.js运行报错Cannot read property '4' of undefined及Promise拒绝警告怎么处理
问题原因
- 核心触发点是
TypeError: Cannot read property '4' of undefined报错:你的id变量初始值为undefined,只有当minmaxcoins数组非空、且数组中至少存在一个元素的第4位数值大于初始值0时,id才会被赋值。只要出现minmaxcoins为空、或者数组内所有元素的第4位数值都小于等于0的情况,id就会保持undefined,后续访问minmaxcoins[id][4]时就会抛出该错误。 - 同步函数报错触发Promise拒绝警告的原因:从调用栈可以看出,
MostProfitable函数是在binance.bookTickers的回调函数中执行的,该SDK的回调逻辑被包裹在Promise内部,你抛出的同步错误没有被SDK内部捕获,就会转为被拒绝的Promise状态,而你没有对应的.catch()处理逻辑,因此触发未处理Promise拒绝的警告,长期运行会导致进程退出。
解决方法
1. 增加边界校验修复逻辑漏洞
修改MostProfitable函数,提前校验数据合法性,避免访问不存在的属性:
function MostProfitable() { // 先校验minmaxcoins合法性,空数据直接跳过逻辑 if (!minmaxcoins || !Array.isArray(minmaxcoins) || minmaxcoins.length === 0) { console.warn('minmaxcoins为空,跳过收益计算'); begin(); return; } var max = 0; var id; for (var i = 0; i < minmaxcoins.length; i++) { // 校验当前元素第4位存在再做比较 if (minmaxcoins[i] && typeof minmaxcoins[i][4] !== 'undefined' && Number(minmaxcoins[i][4]) > Number(max)) { max = minmaxcoins[i][4]; id = i; } } try { // 先校验id和对应元素存在再执行逻辑 if (typeof id !== 'undefined' && minmaxcoins[id] && minmaxcoins[id][4] >= 0.6) { console.info('Max coin: ', minmaxcoins[id][0], ' ', minmaxcoins[id][1]); console.info('Min coin: ', minmaxcoins[id][2], ' ', minmaxcoins[id][3]); console.info('Profit: ', minmaxcoins[id][4], '%'); const d = new Date(); opportunity = opportunity + 1; console.info( opportunity, ' ***********************************************', d ); begin(); } else { // 无符合条件的标的时也继续流程 begin(); } } catch (error) { console.error('MostProfitable执行出错:', error); begin(); } }
2. 增加全局兜底避免进程崩溃
在项目入口文件顶部添加全局监听,兜底捕获所有未处理的Promise拒绝,避免进程直接退出:
// 全局捕获未处理的Promise拒绝 process.on('unhandledRejection', (reason, promise) => { console.error('未处理的Promise拒绝:', '原因:', reason, '对应Promise:', promise); });
额外建议
建议同步排查上游minmaxcoins的生成逻辑,确认出现空数组、所有收益为负的场景是否符合预期,从数据源头减少异常场景的出现。
内容的提问来源于stack exchange,提问作者ALAEDDIN
相关产品推荐
相关产品推荐

