Javascript Heroku-无头镀铬-连接被拒绝
我目前正在使用:Heroku无头chrome构建包。 我遇到了这个令人愤怒的错误,我的节点脚本(如下所示)无法连接到chrome实例。我得到一个非常明确的错误是:Javascript Heroku-无头镀铬-连接被拒绝,javascript,google-chrome,heroku,headless,Javascript,Google Chrome,Heroku,Headless,我目前正在使用:Heroku无头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 TC
{ 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时,我在proc文件中使用了两个不同的proc。一个用于启动节点脚本的
web
。另一个用于启动headless chrome守护进程
在heroku上,这两个不同的程序甚至不共享同一个dyno。这意味着,至少在理论上,我们处于完全不同的“盒子”上。这导致他们在ENV中设置了不同的端口(在那一点上这并不重要——他们也可能在不同的大陆上)
解决方案:
让节点脚本启动实际的headless chrome,然后使用CDP
接口最终连接到该子进程
另外-如果您在这里并且对节点的CDP
接口的文档感到好奇,那么它目前并不存在。你最好的选择,实际上相当不错,是:
狩猎快乐
编辑:
我们如何处理从应用程序源启动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
(在用于抓取动态网站的REST API中使用。它使用headless Chrome和Cheerio。)你能分享一些关于“让节点脚本启动实际的headless Chrome”的代码吗?@TomSöderlund-我添加了一个片段,让大家了解了这个想法:]很酷的东西:)是的-我们也这么做了。我们在编辑中采用了上述方法,因为出于各种原因,我们需要终止/启动chrome。