【问题标题】:Functioning Heroku-deployed Twitter bot stills shows Application error?运行 Heroku 部署的 Twitter 机器人仍然显示应用程序错误?
【发布时间】:2019-09-13 04:30:45
【问题描述】:

我在 Heroku 上部署了一个正常工作的 Twitter 机器人 (@Sunlight_Bot),但仍然显示此错误:

日志显示错误 H14,我认为这是因为我的机器人在帖子之间等待 (setInterval) 时关闭了测功机,对吗?

2019-04-23T22:26:16.989176+00:00 app[api]: Release v81 created by user <user>
2019-04-23T22:26:16.989176+00:00 app[api]: Deploy ... by user <user>
2019-04-23T22:26:17.000000+00:00 app[api]: Build succeeded
2019-04-23T22:26:18.042459+00:00 heroku[worker.1]: Stopping all processes with SIGTERM
2019-04-23T22:26:18.104139+00:00 heroku[worker.1]: Process exited with status 143
2019-04-23T22:26:19.664782+00:00 heroku[worker.1]: Starting process with command `node app.js`
2019-04-23T22:26:20.333252+00:00 heroku[worker.1]: State changed from starting to up
2019-04-23T22:27:53.987454+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/" host=<host> request_id=<id> fwd="<fwd>" dyno= connect= service= status=503 bytes= protocol=https
2019-04-23T22:27:54.206902+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/favicon.ico" host=<host> request_id=<id> fwd="<fwd>" dyno= connect= service= status=503 bytes= protocol=https

为什么 Heroku 仍然显示此应用程序错误,尽管机器人正常运行?这是我可以/应该解决的问题吗?

这是代码。 setInterval 每六个小时调用一次tweeter() 函数。该函数从 Heroku PostgreSQL 数据库中获取一些数据,对其进行格式化,然后将其作为一条或多条推文发布到 Twitter。

function tweeter() {

    stafferInfo = {};
    tweetString = '';

    let pool = new pg.Pool({
        connectionString: process.env.DATABASE_URL,
        ssl: true
    } || config.db);

    pool.connect()

        .then(client => {
            pgClient = client;
            return pgClient.query(randomRow)
                .then(res => {
                    stafferInfo = res.rows[0];   // (1) GET INFO FROM DB AND SET VARIABLE
                    // console.log(stafferInfo);

                })
                .catch(err => console.error('Error executing first psql query', err.stack));
        })

        .then(() => {
            return pgClient.query(updateTweeted) // (2) UPDATE "TWEETED" COUNT
                .then(res => {
                    // console.log(res);
                })
                .catch(err => console.error('Error executing second psql query', err.stack));
        })
        .then(() => {                     // (3) POST TWEET
            tweetString = formatTweet(stafferInfo);

            if ((`${tweetString} (data from ProPublica's Trump Town dataset)`).length <= (280)) {
                tweetString += ` (data from ProPublica's Trump Town dataset)`
            }
            else if (tweetString.length <= 280) {

                console.log(tweetString);

                sendTweet(tweetString);

                if (stafferInfo.linkedin_url) {
                    console.log(formatLinkedIn(stafferInfo));
                    sendTweet(formatLinkedIn(stafferInfo));
                }
                if (stafferInfo.resume_document_url) {
                    console.log(formatResume(stafferInfo));
                    sendTweet(formatResume(stafferInfo));
                }
                if (stafferInfo.financial_disclosure_url) {
                    console.log(formatFinancialDisclosure(stafferInfo));
                    sendTweet(formatFinancialDisclosure(stafferInfo));
                }
                if (stafferInfo.ethics_waiver_url) {
                    console.log(formatEthicsWaiver(stafferInfo));
                    sendTweet(formatEthicsWaiver(stafferInfo));
                }
            }
            else {
                console.log(`Tweet is longer than 280 characters: ${tweetString}`);
            }
        })
        .catch(err => {
            console.error('Error acquiring client: ', err.stack);  // IF ERROR THROW TO CONSOLE
        })
        .finally(() => {                                // EITHER WAY SHUT DOWN CLIENT & POOL AFTER
            if (pgClient) {
                pgClient.release();
            }
            pool.end(); // pool shutdown
        });
}

// tweeter(); // For testing

setInterval(tweeter, 6*60*60*1000);

【问题讨论】:

  • 以下是否回答了您的问题?
  • 我明白为什么method=GET path="/" 会抛出一个错误,因为没有 HTTP 服务器,但是 Heroku 的错误(在浏览器和终端中)在这种情况下不是非常神秘和无用吗?除了Build succeeded 和一堆奇怪的错误之外,还有什么方法可以知道 Twitter 机器人实际上是在 Heroku 上运行的? :) 顺便感谢您的帮助。我很高兴将其标记为已回答,但只是希望将来能够根据自己的知识了解更多...
  • 日志中的错误确实显示“没有运行 Web 进程”:-) 我已经编辑了我的答案,为您提供了一个示例,说明如何添加 HTTP 服务器并让它给出基本状态.

标签: node.js postgresql twitter bots


【解决方案1】:

您的机器人不会启动 HTTP 服务器,因此您不应期望它响应请求。

如果您想让您的机器人响应 HTTP 请求,您可以安装 express,让它以某种状态响应。先安装express

npm install express

然后添加到您的机器人:

const express = require('express');
const app = express();
const port = 3000;
let tweet_count = 0;

// Insert your bot here
// And modify it to increment `tweet_count` when it sends a msg

app.get('/', (req, res) => res.send(`Twitter bot is up and running! Tweets sent: ${tweet_count}`));

app.listen(port, () => console.log(`Twitter bot http server listening on port ${port}!`));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 2021-10-29
    • 2016-09-10
    • 2017-02-09
    • 2021-10-18
    • 2013-09-07
    • 2019-07-27
    相关资源
    最近更新 更多