Heroku - 无头 Chrome - 连接被拒绝
Heroku - Headless Chrome - Connection Refused
我目前正在使用:Heroku Build Pack for headless chrome。
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);
});
有没有人有幸让这种类型的东西起作用?
好吧,我明白了。部署到 heroku 时,我在 Procfile 中使用了两个不同的 Proc。一个用于启动节点脚本的 web
。另一个用于启动无头 chrome 守护进程。
在 heroku 上,这两个不同的 proc 甚至不共享相同的 dyno。这意味着他们我们完全分开 "boxes" - 至少在理论上是这样。这导致他们在 ENV 中设置了不同的端口(这在那个时候甚至并不重要 - 他们也可能在不同的大陆)
解决方案:
让节点脚本启动实际的无头 chrome,然后最终使用 CDP
接口连接到该子进程。
另外 - 如果你在这里并且对节点的 CDP
接口的文档感到好奇 - 它目前不存在。您最好的选择是:https://chromedevtools.github.io/debugger-protocol-viewer/
狩猎愉快。
编辑:
我们如何处理从应用程序源启动 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', () => {})
我的 Procfile
首先启动 Chrome,然后是我的 Node.js 服务器:
web: /app/.apt/usr/bin/google-chrome & node app/server.js
(用于 Scraping Service,用于抓取动态网站的 REST API。它使用无头 Chrome 和 Cheerio。)
我目前正在使用:Heroku Build Pack for headless chrome。 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);
});
有没有人有幸让这种类型的东西起作用?
好吧,我明白了。部署到 heroku 时,我在 Procfile 中使用了两个不同的 Proc。一个用于启动节点脚本的 web
。另一个用于启动无头 chrome 守护进程。
在 heroku 上,这两个不同的 proc 甚至不共享相同的 dyno。这意味着他们我们完全分开 "boxes" - 至少在理论上是这样。这导致他们在 ENV 中设置了不同的端口(这在那个时候甚至并不重要 - 他们也可能在不同的大陆)
解决方案:
让节点脚本启动实际的无头 chrome,然后最终使用 CDP
接口连接到该子进程。
另外 - 如果你在这里并且对节点的 CDP
接口的文档感到好奇 - 它目前不存在。您最好的选择是:https://chromedevtools.github.io/debugger-protocol-viewer/
狩猎愉快。
编辑:
我们如何处理从应用程序源启动 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', () => {})
我的 Procfile
首先启动 Chrome,然后是我的 Node.js 服务器:
web: /app/.apt/usr/bin/google-chrome & node app/server.js
(用于 Scraping Service,用于抓取动态网站的 REST API。它使用无头 Chrome 和 Cheerio。)