首页 > 解决方案 > 节点 JS 应用程序的 Heroku 'H12' 请求超时错误

问题描述

我在 Heroku 上部署了一个 Node js 应用程序,当我尝试启动它时收到错误 H12 请求超时。不确定我的 app.js 文件有什么问题。我正在使用 node、express 和 ejs 进行模板化。也许我的 GET 方法有很多事情要做。任何有关 H12 错误的帮助将不胜感激。

我的代码:

const express = require("express");
const ejs = require("ejs");
const ping = require('ping');
const app = express();

app.set('view engine', 'ejs');

app.get("/", function(req, res){
    var Data = [];
    const hosts = [
        '8.8.8.8',
        'nibbler',
        '10.204.2.14',
        'nic-bqnbnntkwq.dynamic-m.com',
        'co-omaha-wired-qqrrbzpgwq.dynamic-m.com',
        'co-austin-cjjbbdqcwq.dynamic-m.com',
        'fctx-wired-vtwpbhcgwq.dynamic-m.com',
        '172.16.10.1',
        'fc-greenwood-dzrrbnzqwq.dynamic-m.com',
        'fcpa-3400-wired-nndkzwnrwq.dynamic-m.com',
        'fcpa-chrome-gwmjjghjwq.dynamic-m.com',
        'fcga-wired-bjkwtcjqwq.dynamic-m.com',
    ];   

    for(var i =0; i<hosts.length; i++){
        ping.promise.probe(hosts[i]).then(function (resp) {

            const destination = ['Azure DC','FC Nevada','Google DNS', 'Austin', 'Omaha', 
            'FC Greenwood', 'FC Georgia', 'FC Pennsylvania 3500', 'FC Pennsylvania 35400', 
            'FC Dallas', 'Nibbler DNS', 'NIC'];

            if(resp.alive){
                const input = {
                    "Destination": "",
                    "Host": resp.host,
                    "Status": "Alive",
                    "Avg": resp.avg
                }
                Data.push(input);
            }
            else {
                const input = {
                    "Destination": "",
                    "Host": resp.host,
                    "Status": "Dead",
                    "Avg": resp.avg
                }
                Data.push(input);
            }
            if(Data.length == 12){
                Data.sort(function(a, b) {
                    var A = a.Host.toUpperCase();
                    var B = b.Host.toUpperCase();
                    return (A < B) ? -1 : (A > B) ? 1 : 0;
                });
                for(var i = 0; i<destination.length; i++){
                    Data[i].Destination = destination[i];
                }
                res.render("home", {data: Data});
            }   
        });
    }
});

app.listen(process.env.PORT || 3000);

标签: javascriptnode.jsexpressherokuejs

解决方案


H12 意味着您的应用需要超过 30 秒才能完成对请求的响应。https://devcenter.heroku.com/articles/error-codes#h12-request-timeout

ping 所有这些主机可能需要 30 多秒。您是否在开发环境中对其进行了计时?

在 heroku 上,长时间运行的任务应该在工人测功机上运行。在这种情况下,工作人员可以定期 ping 这些主机并将结果写入某种数据存储(redis 或 postgres)。Web 应用程序将简单地从数据存储中提取结果并呈现页面。

Heroku 在这里有一些很好的文档https://devcenter.heroku.com/articles/node-redis-workers


推荐阅读