【问题标题】:Variabel won't keep values using Heroku变量不会使用 Heroku 保留值
【发布时间】:2022-01-26 16:22:59
【问题描述】:

一个很小的例子

let value = null;
const getValues = () => {
  fetch('/third-party-api')
    .then(res => res.json())
    .then(data => {
      value = data;
    })
}

getValues();

app.get("/values", async (req, res) => {
  res.json(value);
});

当它被部署时,它会工作。 但是在 x 时间后(有时是几个小时,有时它会工作一整天),该值将恢复为空。 我为 Heroku 付费,所以服务器永远不会休眠,这就是为什么发生这种情况对我来说没有意义。

我可以以某种方式阻止这种情况,因此该值不会恢复为 null 吗?

我为什么要这样做:

第三方 API 非常庞大,大约需要 30 秒才能获取。所以我只是创建了这个小 API 来添加分页,并且只在构建时调用第三方

【问题讨论】:

  • 我看不出这不起作用的原因。如果可能,尝试将“值”设置为全局变量。 global.value = null
  • get('/values' 函数调用不等待值存在。请看一下我链接的问题。
  • 嗨@evolutionxbox - 感谢您的回复。我知道我首先能够在 getValues 完成后调用 /values。部署后等待 1-2 分钟就足够了,在这里它可以工作。问题是为什么它会回到 null
  • 我怀疑这个例子被简化到我们错过了实际问题的地步。每次你的应用启动时你都会打电话给getValues()吗? Heroku dynos 经常重启,至少每天一次,因为这只是在内存中,你必须再次获取数据。

标签: javascript node.js express heroku


【解决方案1】:

如果您专门在此路由中使用此方法,则可以在您的路由中简单地使用中间件。你可以这样做:

let value = null;
const getValues = async (req, res, next) => {
  if (!value) { 
    next();
  }

  try {
  const res = await fetch('/third-party-api');
  const resJson = JSON.parse(res);
  value = resJson;
  next();
  } catch (e) {
     res.send({error: e});
  }
}

// getValues(); remove this call

app.get("/values", getValues ,async (req, res) => {
  res.json(value);
});

【讨论】:

  • 每次我调用 /values 时不会执行 getValues 吗?
  • 为每个请求调用“getValues”是多余的,@jonask 只希望每次构建都调用一次。
  • 是的,我现在进行了更改,如果您由于任何原因没有值,它会先获取然后调用下一个中间件。如果在前面的步骤中有一些处理,这就是中间件的美妙之处。我建议您将此类数据保存在状态中并从那里获取它,或者可能是 redis 缓存是一个不错的选择。
  • @Rajan 是的,但是如果不是问题的一部分的其他代码将值设置为null 怎么办?它解决了问题吗?不,它类似于根据值状态检查缓存和返回响应。
猜你喜欢
  • 2021-11-17
  • 2011-04-09
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多