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

Node/Express路由请求中Promise未在后续请求中重新调用问题

解决Express路由中Promise仅在服务器重启时执行的问题

嘿,我一眼就看出问题所在了——你把getMediumData当成了每次请求都会重新执行的函数,但实际上它是一个已经被执行过的Promise实例!

问题根源

当你的Node.js服务器启动时,getMediumData这个Promise就已经被创建并执行了一次。之后每次用户刷新页面请求/mediumData,你的路由处理函数只是在重复使用这个已经完成(或失败)的Promise结果,根本不会重新触发数据获取的逻辑。这就是为什么只有服务器重启时才会更新数据。

修复方案

你需要把getMediumData改成一个返回Promise的函数,这样每次请求进来时,调用这个函数才会重新执行数据获取操作。修改后的路由代码如下:

router.get("/mediumData", (request, response) => {
  // 关键:调用函数,而不是直接使用已有的Promise实例
  getMediumData()
    .then(mediumData => {
      response.json(mediumData);
    })
    .catch(error => {
      // 优化:返回正确的HTTP状态码+有意义的错误信息
      response.status(500).send(error.message || "获取Medium数据失败");
    });
});

对应的getMediumData需要定义成函数形式,示例如下:

// 定义为返回Promise的函数
const getMediumData = () => {
  return new Promise((resolve, reject) => {
    // 这里替换成你的实际数据获取逻辑(比如调用外部API、查询数据库等)
    fetch("https://your-medium-data-api.com/data")
      .then(res => res.json())
      .then(data => resolve(data))
      .catch(err => reject(err));
  });
};

额外优化建议

  • 如果数据不需要实时更新,可以添加缓存逻辑(比如内存缓存或Redis),避免每次请求都重复调用外部接口,提升服务器性能。
  • 错误处理时遵循HTTP规范,用合适的状态码(比如500表示服务器内部错误,400表示请求参数错误),同时返回用户友好的错误信息。
  • 你之前尝试的防抖其实没必要在这里用——防抖是用来限制高频触发的函数执行,但你的问题是根本没有触发新的请求,方向不对哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 07:02:34