You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Express中等待HTTP请求?异步API调用渲染报错排查

问题分析与修复方案

你的代码主要有三个问题导致当前错误:

1. policies变量未正确声明与传递

路由处理函数里直接使用policies,但这个变量既没在当前作用域声明,也没有通过getPolicies函数返回或填充。直接引用会导致变量未定义,或者即使是全局变量,也无法保证在await getPolicies后被正确赋值。

2. API响应解构可能出错

如果目标API返回的JSON结构里没有data字段,const {data} = await got.get(url).json()会让data变成undefined,后续在constructDataSet里访问它的属性自然会抛出“Cannot read properties of undefined”。

3. 缺少错误处理

网络请求可能失败(比如超时、API返回4xx/5xx状态码),但你的代码没有任何错误捕获逻辑,一旦请求失败,整个流程会直接中断。


修复后的代码示例

router.post('/getPolicies', async function(req, res, next){
  try {
    let issnList = req.body.issn_list
    issnList = issnList.split(/\r?\n/)
    // 初始化policies为数组,存储处理后的数据
    const policies = await getPolicies(issnList);
    res.render("policy", {data: policies})
  } catch (err) {
    // 捕获所有错误,传递给错误处理中间件
    next(err)
  }
});

async function getPolicies(issns){
  const policies = [];
  for (let i = 0; i < issns.length; i++){
    const issn = issns[i].trim(); // 去除可能的空白字符
    if (!issn) continue; // 跳过空行

    const url = "some_url" + issn;
    // 先获取完整响应,避免解构出错
    const response = await got.get(url).json();
    // 检查响应是否有需要的字段,或者直接使用response
    const processedData = constructDataSet(issn, response);
    policies.push(processedData);
  }
  // 返回处理后的数据集
  return policies;
}

function constructDataSet (issn, data){
  // 先判断data是否存在,再访问属性
  if (!data) {
    return { issn, error: "API返回数据为空" };
  }
  // ... 你的数据构造逻辑
  // 示例:假设需要提取data里的policy字段
  return {
    issn,
    policy: data.policy || "无相关政策"
  };
}

关键修复点说明

  • 把policies作为局部变量在路由中初始化,通过getPolicies函数返回填充后的数组,确保await后能拿到完整数据。
  • 去掉直接解构{data}的操作,先获取完整响应对象,在constructDataSet里添加data存在性判断,避免访问undefined的属性。
  • 添加try/catch捕获整个流程的错误,传递给Express的错误处理中间件,防止请求直接崩溃。
  • 对issn做空白处理,跳过空行,避免无效的API调用。

内容的提问来源于stack exchange,提问作者Juan Francisco Carías

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:30:43