[node.js] Heroku + node.js 오류 (웹 프로세스가 시작 후 60 초 내에 $ PORT에 바인딩하지 못했습니다)

첫 번째 node.js 앱이 있습니다 (로컬에서 잘 실행 됨).하지만 heroku를 통해 배포 할 수 없습니다 (처음으로 / heroku 포함). 코드는 다음과 같습니다. 그래서 너무 많은 코드를 작성할 수 없으므로 네트워크 내에서 로컬로 코드를 실행해도 아무런 문제가 없음을 나타냅니다.

 var http = require('http');
 var fs = require('fs');
 var path = require('path');

 http.createServer(function (request, response) {

    console.log('request starting for ');
    console.log(request);

    var filePath = '.' + request.url;
    if (filePath == './')
        filePath = './index.html';

    console.log(filePath);
    var extname = path.extname(filePath);
    var contentType = 'text/html';
    switch (extname) {
        case '.js':
            contentType = 'text/javascript';
            break;
        case '.css':
            contentType = 'text/css';
            break;
    }

    path.exists(filePath, function(exists) {

        if (exists) {
            fs.readFile(filePath, function(error, content) {
                if (error) {
                    response.writeHead(500);
                    response.end();
                }
                else {
                    response.writeHead(200, { 'Content-Type': contentType });
                    response.end(content, 'utf-8');
                }
            });
        }
        else {
            response.writeHead(404);
            response.end();
        }
    });

 }).listen(5000);

 console.log('Server running at http://127.0.0.1:5000/');

어떤 아이디어?



답변

Heroku는 앱에 포트를 동적으로 할당하므로 포트를 고정 번호로 설정할 수 없습니다. Heroku는 포트를 env에 추가하므로 거기서 끌어 올 수 있습니다. 당신의 말을 들어주세요 :

.listen(process.env.PORT || 5000)

그렇게하면 로컬에서 테스트 할 때 포트 5000을 계속들을 수 있지만 Heroku에서도 작동합니다.

Node.js 에서 Heroku 문서를 확인 하십시오 .


답변

Heroku가이 때 오류가 발생 포트 또는 호스트 이름 바인딩 실패 시를 server.listen(port, [host], [backlog], [callback]).

Heroku가 요구하는 것은 .listen(process.env.PORT)또는.listen(process.env.PORT, '0.0.0.0')

보다 일반적으로 다른 환경을 지원하려면 다음을 사용하십시오.

var server_port = process.env.YOUR_PORT || process.env.PORT || 80;
var server_host = process.env.YOUR_HOST || '0.0.0.0';
server.listen(server_port, server_host, function() {
    console.log('Listening on port %d', server_port);
});


답변

코드에서 포트를 지정하지 않으면 프로세스 가 아니web 어야하며 아마도 포트 여야합니다.worker 대신 프로세스 .

따라서 Procfile특정 명령을 입력하여 읽도록 변경하십시오 .

worker: YOUR_COMMAND

CLI에서 실행하십시오.

heroku scale worker=1


답변

yeoman의 angular-fullstack 생성 프로젝트를 사용하고 IP 매개 변수를 제거하는 동안 동일한 문제가 발생했습니다.

이 코드를 교체했습니다

server.listen(config.port, config.ip, function () {
  console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
});

server.listen(config.port, function () {
  console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
});


답변

포트와 호스트를 모두 통과하는 사람들에게는 Heroku 가 바인딩되지 않습니다 localhost .

당신은 통과해야합니다 0.0.0.0호스트 .

올바른 포트를 사용하더라도 이 조정을해야했습니다 :

# port (as described above) and host are both wrong
const host = 'localhost';
const port = 3000;

# use alternate localhost and the port Heroku assigns to $PORT
const host = '0.0.0.0';
const port = process.env.PORT || 3000;

그런 다음 평소와 같이 서버를 시작할 수 있습니다.

app.listen(port, host, function() {
  console.log("Server started.......");
});

자세한 내용은 여기에서 볼 수 있습니다 : https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error


답변

제 경우에는 https://hapijs.com/의 예제를 사용하고있었습니다.

교체 한 문제를 해결하려면

server.connection({
    host: 'localhost',
    port: 8000
});

server.connection({
    port: process.env.PORT || 3000
});


답변

청취 포트를 3000에서 변경 (process.env.PORT || 5000)하여 문제 를 해결했습니다.