Heroku - 无头镀铬 - 拒绝连接

时间:2017-04-04 21:46:55

标签: javascript google-chrome heroku headless

我目前正在使用:Heroku Build Pack用于无头镀铬。 https://github.com/heroku/heroku-buildpack-google-chrome/

我遇到了这个令人愤怒的错误,我的节点脚本(如下所示)无法连接到chrome实例。我得到一个非常确定的错误:

{ Error: connect ECONNREFUSED 127.0.0.1:30555
    at Object.exports._errnoException (util.js:1018:11)
    at exports._exceptionWithHostPort (util.js:1041:20)
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1090:14)
  code: ‘ECONNREFUSED’,
  errno: ‘ECONNREFUSED’,
  syscall: ‘connect’,
  address: ‘127.0.0.1’,
  port: 30555 }

我的节点超简单脚本:

CDP((client) => {
    // extract domains
    // const {Network, Page} = client;
    const Network = client.Network
    const Page = client.Page
    // setup handlers
    Network.requestWillBeSent((params) => {
        console.log(params.request.url);
    });
    Page.loadEventFired(() => {
        client.close();
    });
    // enable events then start!
    Promise.all([
        Network.enable(),
        Page.enable()
    ]).then(() => {
        return Page.navigate({url: 'https://www.something.com/'});
    }).catch((err) => {
        console.error(err);
        client.close();
    });
}).on('error', (err) => {
    // cannot connect to the remote endpoint
    console.error(err);
});

有没有人有运气让这类事情发挥作用?

2 个答案:

答案 0 :(得分:0)

好吧我明白了。部署到heroku时,我在Procfile中使用了两个不同的Proc。一个用于启动Node脚本的web。另一个用于发射无头镀铬守护进程。

在heroku上,这两个不同的触发器甚至不共享同一个dyno。这意味着他们我们完全是分开的“盒子” - 至少在理论上是这样。这导致他们在ENV中设置了不同的端口(当时它不是很重要 - 它们可能在不同的大陆上)

解决方案:

让节点脚本启动实际的无头chrome,然后使用CDP接口最终连接到该子进程。

另外 - 如果你在这里并且对节点的CDP接口的文档感到好奇 - 它目前还不存在。你最好的选择,实际上非常好,是:{{3}}

快乐狩猎。

编辑:

我们如何处理从应用程序源启动chrome子进程的示例

const spawn = require('child_process').spawn


spawn('/path/to/chrome/binary',[{`--remote-debugging-port=${process.env.PORT}`]) // Set by heroku
.on('close', () => console.log('CHROME_PROCESS_CLOSE'))
.on('error', e => console.log('CHROME_PROCESS_ERROR', e))
.on('exit', (e, z, a) => console.log('CHROME_PROCESS_EXIT', e, z, a))
.on('data', () => {})

答案 1 :(得分:0)

我的Procfile看起来像首先启动Chrome,然后是我的Node.js服务器:

web: /app/.apt/usr/bin/google-chrome & node app/server.js

(用于Scraping Service,一个用于抓取动态网站的REST API。它使用无头Chrome和Cheerio。)

相关问题