2017-04-04 4 views
3

현재 헤드리스 크롬 용 : Heroku Build Pack을 사용 중입니다. https://github.com/heroku/heroku-buildpack-google-chrome/Heroku - 헤드리스 크롬 - 연결 거부 됨

내 노드 스크립트 (아래 표) 크롬 인스턴스에 연결할 수 없습니다이 화나는 오류가 발생하고 있습니다.

{ 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에서 두 가지 Procs를 사용했습니다. 하나는 노드 스크립트를 시작한 web입니다. 헤드리스 크롬 데몬을 시작하기위한 또 하나.

heroku에서 두 개의 서로 다른 procs는 동일한 dyno를 공유하지 않습니다. 우리가 의미하는 바는 적어도 이론적으로는 "상자"를 완전히 분리한다는 것입니다. 이것은 그들이 (이 경우에도 그 시점에서 중요하지 않는 것이 - 그들은뿐만 아니라 다른 대륙에있을 수 있습니다)에 ENVs에 설정된 다른 포트를 가진 결과

솔루션 :

노드 스크립트는 실제 헤드리스 크롬을 시작 가지고, 궁극적으로 CDP 인터페이스를 사용하여 해당 하위 프로세스에 연결합니다.

또한 여기에있어 노드에 대한 CDP 인터페이스 설명서가 궁금하다면 지금은 존재하지 않습니다. 실제로 가장 좋은 옵션은 다음과 같습니다. https://chromedevtools.github.io/debugger-protocol-viewer/

해피 헌팅.

편집 : 우리는 응용 프로그램 소스에서 크롬 자식 프로세스를 시작하는 처리 방법의

Procfile은 다음과 같습니다 내

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

먼저 크롬, 다음 내 Node.js를 서버를 시작합니다 :

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

(Scraping Service, 동적 웹 사이트 스크래핑 용 REST API, 헤드리스 Chrome 및 Cheerio 사용)

+0

멋진 것들 :) 예 - 우리도 그렇게했습니다. 우리는 여러 가지 이유로 크롬을 죽이거나 시작해야했기 때문에 편집에서 언급 한 접근법을 사용했습니다. –