2017-04-04 87 views
3

我目前正在使用:Heroku Build Pack for headless chrome。 https://github.com/heroku/heroku-buildpack-google-chrome/Heroku - 無頭Chrome - 連接拒絕

我遇到了這個令人生厭的錯誤,我的節點腳本(show below)無法連接到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); 
}); 

有沒有人有任何運氣得到這種類型的東西的工作?

回答

0

好吧我想通了。在部署到heroku時,我在Procfile中使用了兩個不同的Proc。一個用於啓動節點腳本的web。另一個用於啓動無頭鍍鉻物守護進程。

在heroku上,這兩個不同的procs甚至不共享相同的dyno。意思是他們我們完全分開的「盒子」 - 至少在理論上。這導致了他們有在ENVS設置不同的端口(而不是它甚至要緊在這一點 - 他們很可能會成爲在不同的大洲)

解決方案:

有節點劇本開始實際的無頭鍍鉻,然後最終使用CDP界面連接到該子進程。

另外 - 如果你在這裏,也很好奇CDP接口節點的文檔 - 它目前不存在。你最好的選擇,其實很不錯,是:https://chromedevtools.github.io/debugger-protocol-viewer/

快樂的狩獵。

編輯:我們如何處理從應用程序源啓動鉻子進程

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',() => {}) 
+0

您可以在「讓節點腳本啓動實際無頭鍍鉻」上分享一些代碼嗎? –

+0

@TomSöderlund - 我添加了一個片段,它可以讓你的想法跨越:] –

0

Procfile看起來是這樣的,首先啓動瀏覽器,然後我的Node.js服務器:

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

(用於Scraping Service,一個用於抓取動態網站的REST API,它使用無頭Chrome和Cheerio。)

+0

很酷的東西:)是的 - 我們也這麼做了。我們採用了上述方法 - 在編輯中 - 因爲我們需要因各種原因殺死/啓動chrome。 –