You need to enable JavaScript to run this app. Node应用调用Ethplorer API时报UnhandledPromiseRejectionWarning与req.next错误
优惠活动
大模型
产品
解决方案
定价
更多

Node应用调用Ethplorer API时报UnhandledPromiseRejectionWarning与req.next错误

两类运行异常的根因定位

报错原因拆解

  • req.next is not a function 触发逻辑
    该报错并非来自手写的req.next调用,是异步流程错误导致的Express内部上下文异常:
    1. 将res.render写在forEach循环体内,在所有Ethplorer API的异步请求返回前,就同步、重复触发渲染逻辑。第一次调用res.render后,当前HTTP响应就进入已终结状态,后续循环中重复操作已结束的响应对象时,Express内部的错误处理逻辑会尝试调用路由上下文绑定的next方法,一旦上下文被重复操作破坏,就会抛出该报错。
    2. 外层Wallet.find({})的数据库查询Promise未挂载异常捕获,一旦数据库查询本身出错,整个路由的异步处理流程会直接断裂,进一步加剧上下文丢失的问题。
  • UnhandledPromiseRejectionWarning 触发逻辑
    1. 外层Wallet.find({}).then()的Promise链没有兜底错误捕获,数据库查询抛出的异常无法被正常捕获。
    2. 由于响应被提前终结,部分异步API请求的异常捕获逻辑没有正确关联到当前请求的处理流程中,最终漏出未处理的Promise拒绝。

修正后的可运行代码

app.get('/ethplorer', function(req, res) {
  const rp = require('request-promise');
  Wallet.find({})
    .then(function(wallets) {
      // 将每个钱包的API请求封装为独立Promise,不在循环内操作响应对象
      const requestList = wallets.map(w => {
        const requestOptions = {
          method: 'GET',
          url: `https://api.ethplorer.io/getAddressInfo/${w.address}`,
          qs: {
            'apiKey': 'aaa'
          },
          json: true
        };
        // 单请求异常单独捕获,避免单个接口失败阻断全流程
        return rp(requestOptions).catch(err => {
          console.log('钱包数据获取失败:', err);
          return null;
        });
      });
      // 等待所有请求完成后再统一处理响应
      return Promise.all(requestList);
    })
    .then(function(allData) {
      // 过滤掉请求失败的空值
      const validEthData = allData.filter(item => item !== null);
      // 仅调用一次渲染方法,传递完整有效数据
      res.render('ethereum', {
        user: req.user,
        eth: validEthData
      });
    })
    .catch(function(err) {
      // 全流程兜底捕获,消除未处理的Promise拒绝
      console.error('接口处理异常:', err);
      res.status(500).send('服务暂时不可用');
    });
});

核心修正点

  • 移除循环内的提前、重复res.render调用,从根源上避免响应对象被破坏引发的内部报错
  • 收集所有异步API请求为Promise队列,用Promise.all等待所有请求完成后再渲染页面,保证传递给页面的数据完整
  • 为全链路的Promise逻辑加上分层错误捕获,彻底消除UnhandledPromiseRejectionWarning
  • 为单个API请求增加独立异常捕获,单钱包接口失败时不会影响其他地址的数据获取

内容的提问来源于stack exchange,提问作者jimpix1988

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 02:36:05