【问题标题】:Request myself in Nodejs deployed on Heroku在部署在 Heroku 上的 Nodejs 中请求自己
【发布时间】:2018-09-04 03:49:40
【问题描述】:

我在 Heroku 上部署了一个 Node Express 应用程序。主页需要大约 50 个对外部服务的 HTTP 请求来显示数据。请求需要很长时间,所以我使用缓存。

现在我正在尝试定期向自己请求网页,以强制 Node 继续刷新和缓存数据。这样用户就不必等待 1 分钟才能看到该页面。

以下代码在本地完美运行。但在生产环境(Heroku)我得到Error: connect ECONNREFUSED

setInterval(function() {
  var url = "http://127.0.0.1:" + (process.env.PORT || 3000);
  try {
    http.get(url, {})
  } catch (err) {
    console.error('Error refreshing data')
    console.error(err)
  }
}, 1 * 60 * 1000)

我试过了:

  • http://127.0.0.1:" + (process.env.PORT || 3000)
  • https://127.0.0.1:" + (process.env.PORT || 3000)
  • 0.0.0.0

有什么方法可以找到正确的 ip/host 和端口?

更新

主机名 (https://nameofapp.herokuapp.com/) 确实有效。但是有什么方法可以在不知道宿主的情况下调用自己?

【问题讨论】:

  • "现在我想向自己请求网页,以强制 Node 继续刷新和缓存数据。"我发现这不清楚。这如何帮助您的用户完成他们的 50 个 HTTP 请求?或者你为什么要这样做?
  • 对外部服务的所有 50 个 api 调用大约需要 1 分钟(甚至更多),并且在服务器中完成。我需要 Node 定期刷新该数据。调用我自己会使缓存的数据刷新(如果它已过期)。问题已更新。我觉得还不够清楚。谢谢!

标签: javascript node.js heroku axios


【解决方案1】:

您可以使用request-myself

试试这个代码:

const requestMyself = require('request-myself');
const option = {
    hostname: process.env.BASE_URL,
    timeout: process.env.TIME_IDLING
};

app.use(requestMyself(option, (error, res) => {
    if (error) {
        console.error('RequestMyself error:', error);
    } else {
        console.info('RequestMyself statusCode:', res.statusCode);
    }
}));

设置你的环境变量BASE_URL是你应用的url,TIME_IDLING是请求超时(或者你可以在定义option时改变)

如果你有问题,你可以随意创建一个问题

勾选dyno-metadata,自动生成HEROKU_APP_NAME和一些envprocess.env.HEROKU_APP_NAME),用它来获取你的主机

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-01-09
  • 2013-12-09
  • 1970-01-01
  • 2022-08-15
  • 2018-04-18
  • 2020-08-23
  • 1970-01-01
  • 2016-09-03
相关资源
最近更新 更多