【问题标题】:Express.js app times out when attempting to query a PostgreSQL databaseExpress.js 应用程序在尝试查询 PostgreSQL 数据库时超时
【发布时间】:2021-05-31 13:20:51
【问题描述】:

我构建了一个 Express.js 应用程序,由 Heroku 托管,带有非嵌入式 PostgreSQL 数据库。

该应用程序一直按预期运行,直到大约一个月前,以及在那之前的几个月。然而,当我今天登录时,我遇到了一个严重的问题。

每当我尝试访问任何查询数据库的页面时,它都会尝试加载几秒钟,然后给我标准的 Heroku“应用程序错误”页面。

通过 Javascript 访问数据库

这是我查询数据库的部分代码的样子:

var that = this;
var title = "The Journal";
var queryString = "SELECT * FROM JournalEntry "+
                  "ORDER BY theTimeStamp ASC;";
var extract, data;
const client = new Client({
    connectionString: process.env.DATABASE_URL,
    ssl: { rejectUnauthorized: false }
});

console.log(process.env.DATABASE_URL);
console.log("Hello!");

client.connect();

console.log("My!");

client.query(queryString, (err, result) => {
    if(err) throw err;

    console.log("Lovely!");

    extract = result.rows;
    data = interpretJournalExtract(extract);
    data = objectifyExtract(data);
    client.end();
    that.finaliser.protoRender(req, res, "tabular",
                               { title: title, data: data });
});

这就是我运行这段代码时日志的样子:

2021-03-02T16:12:14.780345+00:00 app[web.1]: postgres://stfonefosxlmgt:227d3914dfb105c6ad3db47ad854f771391b15c8dead2da0a691a66d25cb2f65@ec2-54-228-237-40.eu-west-1.compute.amazonaws.com:5432/de337svimlvbgo
2021-03-02T16:12:14.780701+00:00 app[web.1]: Hello!
2021-03-02T16:12:14.781269+00:00 app[web.1]: My!
2021-03-02T16:12:44.784363+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=GET path="/journal" host=hgmj.herokuapp.com request_id=f28bdda2-f3bd-40b2-a894-e07cb9e0054c fwd="86.191.159.122" dyno=web.1 connect=1ms service=30012ms status=503 bytes=0 protocol=http
2021-03-02T16:12:44.785541+00:00 app[web.1]: GET /journal - - ms - -

您会注意到日志显示为“Hello!”和“我的!”,而不是“可爱!”。

通过 Heroku CLI 访问数据库

还值得注意的是,我可以通过 Heroku CLI 访问数据库,这就是我这样做时屏幕的样子:

-> Connecting to postgresql-curly-19296
psql (12.6 (Ubuntu 12.6-0ubuntu0.20.04.1), server 11.11 (Ubuntu 11.11-1.pgdg16.04+1))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

hgmj::DATABASE=>

底线

为什么会发生这种情况,我该怎么办?

【问题讨论】:

    标签: javascript postgresql express heroku


    【解决方案1】:

    查看您的错误代码 (503),鉴于您的代码之前可以正常工作,这意味着 PostgreSQL 数据库由于某种原因不可用。

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/503

    我建议检查您在此处定义的 DATABASE_URL 环境变量:

    const client = new Client({
    connectionString: process.env.DATABASE_URL,
    ssl: true
    });
    

    【讨论】:

    • 谢谢。我会调查process.env.DATABASE_URL 并告诉你我的进展情况。
    • 您在使用 ssl: true 时是否遇到同样的错误?要隔离错误,请尝试将 client.connect() 更改为 client.connect(err => { if (err) { console.error('connection error', err.stack) } else { console.log('connected' ) } })
    • 嗯好的。你说你可以连接heroku cli。尝试运行“heroku pg:credentials:url DATABASE”来打印连接字符串,并将其作为你的 connectionString: 在客户端对象中
    • connectionString 的格式为 postgresql://user:password@database.server.com:port/database 您可以检查这是否与 console.log(process.env.DATABASE_URL) 匹配
    • 这可能是由于过载而导致的简单超时,如此处所述:devcenter.heroku.com/articles/request-timeout。尝试将您的查询更改为 var queryString = "SELECT * FROM JournalEntry LIMIT 10" 看看是否运行
    【解决方案2】:

    我有同样的问题。 添加

    ssl: { rejectUnauthorized: false }

    连接参数有效。我需要升级 pg 包才能让它工作。

    【讨论】:

    • '我需要升级 pg 包才能工作。'就是这样!
    【解决方案3】:

    可能与https://status.heroku.com/incidents/2208这个问题有关。尝试重置您的数据库凭据。我也有同样的问题,没解决,你可以试试。

    【讨论】:

    • 感谢您富有洞察力的建议。不幸的是,我在我的应用程序上运行了heroku pg:credentials:rotate,但它并没有解决这个问题。
    【解决方案4】:

    我在连接数据库时遇到了类似的问题,在我的情况下,解决方案是将参数 require: true 添加到 ssl 属性。对我来说是这样的:

    const client = new Client({
      connectionString: process.env.DATABASE_URL,
      ssl: { require: true, rejectUnauthorized: false },
    });
    

    【讨论】:

    • 感谢您的建议。不幸的是,这也没有奏效。
    猜你喜欢
    • 2020-12-02
    • 1970-01-01
    • 2022-01-11
    • 2014-08-30
    • 1970-01-01
    • 2012-05-09
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多