Heroku + node.js hatası (Web işlemi, lansmandan sonraki 60 saniye içinde PORT $ 'a bağlanamadı)


447

İlk node.js uygulamam var (yerel olarak iyi çalışıyor) - ancak heroku (w / heroku da ilk kez) aracılığıyla konuşlayamıyorum. Kod aşağıda. SO bana çok fazla kod yazmama izin vermiyor, bu yüzden sadece kodu ağım içinde yerel olarak da çalıştırmanın hiçbir sorun göstermediğini söyleyebilirim.

 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/');

Herhangi bir fikir ?


Kodunuzu buraya gönderebilir misiniz? Tercihen bir http sunucusu başlatıyorsanız .listen () bölümü
Benjamin Gruenbaum

Yanıtlar:


989

Heroku, uygulamanıza dinamik olarak bir bağlantı noktası atar, böylece bağlantı noktasını sabit bir sayıya ayarlayamazsınız. Heroku limanı env'e ekler, böylece oradan çekebilirsiniz. Dinlemenizi buna değiştirin:

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

Bu şekilde, yerel olarak test ettiğinizde yine de 5000 numaralı bağlantı noktasını dinler, ancak Heroku üzerinde de çalışır.

Heroku belgelerine Node.js adresinden buradan ulaşabilirsiniz .


97
process.env.port değil, process.env.PORT kullanmanız önemlidir.
gprasant

güzel! 'websocket' modülüyle benim için çalıştı.
philx_x


2
Teşekkürler, benim için de çalıştı. Bunun Heroku belgelerinde daha açık hale getirilmediğine şaşırdım
sidarcy

@redhotvengeance teşekkür ederim .. büyük / küçük harf duyarlı olduğunu belirtin ve günü kurtarın :)
Mahendran

34

Hata, Heroku adresindeki bağlantı noktasını veya ana bilgisayar adını bağlayamadığında oluşurserver.listen(port, [host], [backlog], [callback]) .

Ne Heroku gerektirir olduğu .listen(process.env.PORT)veya.listen(process.env.PORT, '0.0.0.0')

Daha genel olarak, diğer ortamları desteklemek için şunu kullanın:

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);
});

6
Aşağıdaki çağrı ile: app.listen (serverPort, "localhost", işlev (err) {Heroku başarısız oldu. "Localhost" u "0.0.0.0" olarak değiştirmek yardımcı oldu. Teşekkürler!
pubsy

31

Kodunuz bir bağlantı noktası belirtmezse, bunun bir webişlem olmaması ve muhtemelen workerbunun yerine bir işlem olması gerektiğini belirtmek gerekir .

Yani, Procfileokumak için değiştirin (özel komutunuz doldurulmuş olarak):

worker: YOUR_COMMAND

ve ayrıca CLI üzerinde de çalışır:

heroku scale worker=1

1
Ben '0.0.0.0' IP ile 'localhost' yerine sorunu
çözebilirdim

2
Heroku'da bir Discord botu kullanıyorum ve bu beni bir döngü için attı. Slack, Hipchat, vb botların benzer sorunları olabilir.
Skylar

1
Bu rotaya giderseniz, Kaynaklar sekmesine gittiğinizden, web işlemini ve çalışan işlemi açtığınızdan emin olun. Bu şekilde Heroku bir liman bağlaması beklemez.
Isaac Lyman

1
Ohh çok teşekkür ederim. Bunu aramaya çalışırken çıldırmıştım. Web ve işçi uygulamalarının Heroku'da Procfile açısından farklılık gösterdiğine dair hiçbir fikrim yoktu. Bana bir startsenaryo eklemem gerektiğinden bahsetmeye değerpackage.json
Rishav

1
Benim durumumda procfile web'den işçi değiştirdim. İşe yaradı!! Thkns
rodrigorf

27

Yeoman'ın açısal fullstack tarafından üretilen projeyi kullanırken ve benim için çalışan IP parametresini kaldırırken de aynı sorunu yaşadım.

Bu kodu değiştirdim

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

ile

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

25

Hem limanı hem de konağı geçenler için Heroku'nun bağlanmayacağını unutmayın localhost.

0.0.0.0Ana bilgisayar için geçmeniz gerekir .

Doğru bağlantı noktasını kullanıyor olsanız bile. Bu ayarlamayı yapmak zorundaydık:

# 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;

Ardından sunucuyu her zamanki gibi başlatabilirsiniz:

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

Daha fazla ayrıntıyı burada görebilirsiniz: https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error


3
Bu cevap sadece daha eksiksiz değil, aynı zamanda iki olası sorunu da hedefleyen tek cevaptır. Benim durumumda bağlantı noktası yapılandırması doğruydu, ancak dinleme adresi doğru değildi. Bu kabul edilen cevap olmalı.
Danielo515

Ben aşağıda değiştirir olarak benim durumda çalıştığını const port = 3000;için const port = process.env.PORT || 3000; o Heroku çalışır
vpgodara

benim için gerçekten işe
İbrahim Muhammed


3

Dinleme portumu 3000'den değiştirmek (process.env.PORT || 5000)problemi çözmek için.


2

Benim durumumda Babil'i babel-plugin-transform-inline-çevre-değişkenler eklentisiyle kullanıyordum. Görünüşe göre, Heroku bir dağıtım yaparken PORT env değişkenini ayarlamaz, bu nedenle process.env.PORTdeğiştirilir undefinedve kodunuz Heroku'nun hakkında hiçbir şey bilmediği geliştirme bağlantı noktasına geri döner.


1

Düzenle package.json:

...
"engines": {
"node": "5.0.0",
"npm": "4.6.1"
},
...

ve Server.js:

...
var port = process.env.PORT || 3000;
app.listen(port, "0.0.0.0", function() {
console.log("Listening on Port 3000");
});
...

Benim durumumda o kısmını çıkardım package.json. Güncellemenin de bu sorunu çözmesi gerektiğine inanıyorum.
Mark

1

Aynı sorunu yaşadım çünkü tanımlayamadım Procfile. ProcfilDosya uzantısı olmadan uygulamanızın e adlı kök dizinine bir metin dosyası gönderin . Bu dosya Heroku'ya uygulamanızı başlatmak için hangi komut (lar) ı çalıştırmasını söyler.

web: node app.js

Teşekkürler, bunu yapmayı unuttum. Bu dosya olmadan, heroku dosyaları tamamen yok sayar.
Vladimir Despotovic

0

Ben '0.0.0.0' IP ile 'localhost' yerine sorunu çözebilir aynı sorunu vardı


0

Bağlantı noktası için sabit bir sayı ayarlanamaz, heroku bunu kullanarak dinamik olarak atar process.env.PORT. Ama ikisini de ekleyebilirsiniz, böyle process.env.PORT || 5000. Heroku ilkini, yerel ana makineniz ikincisini kullanır.

Hatta geri arama işlevinizi de ekleyebilirsiniz. Aşağıdaki koda bakın

app.listen(process.env.PORT || 5000, function() {
    console.log("Server started.......");
});

0

Ben hiç kimse beklendiği gibi denedim tüm çözüm, ben varsayılan olarak heroku çalışma .env Dosya kongre PORT korumak gerekir, process.env.PORT, heroku varsayılan olarak Anahtar Kelime PORT arayacaktır.

APP_PORT = gibi yeniden adlandırma işlemlerini iptal edin, bunun yerine env dosyanızda PORT = kullanın.


0

Heroku bash işleminden, ipler gibi bir seçenek ayrıştırıcı kullanarak $ PORT değerini düğüm uygulamanıza aktarın.

İşte bunu nasıl yapabileceğinize bir örnek. Komut dosyaları nesnesinde, package.json'un içine bir başlangıç ​​yöntemi "düğüm sunucusu - port $ PORT" ekleyin.

Sunucu dosyanızda, değeri başlangıç ​​yönteminin bağlantı noktası seçeneğinden (--port $ PORT) almak için yargs kullanın:

const argv = require('yargs').argv;
const app = require('express')();

const port = argv.port || 8081;

app.listen(argv.port, ()=>{
    console.log('Probably listening to heroku $PORT now ', argv.port); // unless $PORT is undefined, in which case you're listening to 8081.
});

Şimdi uygulamanız başladığında, dinamik olarak ayarlanmış $ PORT değerine bağlanacaktır.


0

Benim gibi, Heroku'yu package.jsonkonuşlandırma sırasında dosyanızdan bir komut dosyası çalıştıracak şekilde yapılandırıyorsanız PORT, o komut dosyasının değerini sabit olarak kodlamadığınızdan emin olun ! Bunu yaparsanız, benim gibi olur ve bu hatayı neden aldığınızı anlamaya çalışmak için bir saat harcarsınız.


0

Aynı sorun vardı ama ekspres ve apollo-sunucu ile. Dan çözüm burada :

Yapılması gereken tek özel husus, heroku'nun sunucunun konuşlandığı bağlantı noktasını seçmesine izin vermektir. Aksi takdirde, istek zaman aşımı gibi hatalar olabilir.

Apollo sunucuyu çalışma zamanında Heroku tarafından tanımlanan bir bağlantı noktasını kullanacak şekilde yapılandırmak için, kurulum dosyanızdaki dinleme işlevi PORT ortam değişkeni tarafından tanımlanan bir bağlantı noktasıyla çağrılabilir:

> server.listen({ port: process.env.PORT || 4000 }).then(({ url }) => { 
> console.log(`Server ready at ${url}`); });

0

Benim durumumda iki sorun vardı ...

1) başka bir giriş dosyasından uygulamayı çalıştırdığı için hiç dinleyici yok ve bu çalışma komut dosyası package.json "komut dosyalarından" silindi

resim açıklamasını buraya girin

2) 'Sekanslama' yerine 'Sequelize' ile büyük / küçük harfe duyarlı sorun

resim açıklamasını buraya girin


0

ReactJs kullanıyorum, heroku'ya yüklemek istiyorsanız bunu webpack.config.js'nize ekleyin

Çünkü eklemezseniz hata alırsınız

Hata R10 (Önyükleme zaman aşımı) -> Web işlemi, lansmandan sonraki 60 saniye içinde $ PORT'a bağlanamadı

//webpack.config.js add code like that

const HtmlWebPackPlugin = require(“html-webpack-plugin”);
const MiniCssExtractPlugin = require(“mini-css-extract-plugin”);
var server_port = process.env.YOUR_PORT || process.env.PORT || 5000;
var server_host = process.env.YOUR_HOST || 0.0.0.0’;

module.exports = {
 module: {
 rules: [
 {
 test: /\.js$/,
 exclude: /node_modules/,
 use: {
 loader: babel-loader
 }
 },
 {
 test: /\.css$/,
 use: [MiniCssExtractPlugin.loader, css-loader”]
 }
 ]
 },
 devServer: {
 disableHostCheck: true,
 contentBase: ‘./dist’,
 compress: true,
 inline: true,
 port:server_port,
 host:server_host

},
 plugins: [
 new HtmlWebPackPlugin({
 template: “./src/index.html”,
 filename: index.html
 }),
 new MiniCssExtractPlugin({
 filename: “[name].css”,
 chunkFilename: “[id].css
 })
 ]
};

0

Benim durumumda, ne liman ne de ana bilgisayar sorun oldu. index.js2 dosyalara bölündü. server.js:

//server.js
const express = require('express')
const path = require('path')

const app = express()

app.use(express.static(path.resolve(__dirname, 'public')));
// and all the other stuff
module.exports = app

//app.js
const app = require('./server');
const port = process.env.PORT || 3000;
app.listen(port, '0.0.0.0', () => {
    console.log('Server is running s on port: ' + port)
});

dan package.jsonkaçtık node app.js.

Görünüşe göre sorun buydu. İkisini bir dosyada birleştirdiğimde, Heroku uygulaması beklendiği gibi konuşlandırıldı.


0

Benim sorunum heroku'ya konuşlandırırken bir hata aldım:

Web işlemi, lansmandan sonraki 60 saniye içinde $ PORT'a bağlanamadı

heroku logs --tailterminalde çalışırken . AMA sunucu yerel olarak çalıştırıldığında uygulama beklendiği gibi çalışacaktı.

Bunu dosyamda buldum index.js(sunucu dosyası)

const PORT = process.env.port || 4000

app.listen(PORT, () => {
  console.log(`Server listening on port ${PORT}`)
})

Ama buna sahip olmalıydı

const PORT = process.env.PORT || 4000

app.listen(PORT, () => {
  console.log(`Server listening on port ${PORT}`)
})

Kullanın process.env.PORT, değil process.env.port, çünkü belli ki portaynı değil PORT.

Gprasant'a kredi .


0

İstek son noktasında bağlantı noktası numarasına ihtiyacım olmadığını fark ettim, bu yüzden son nokta herokuapp.comveherokuapp.com:5000 .

listen()Çağrı konak ve callback'inde olmadan şunlar olabilir:

server.listen(5000);

Varsayılan bağlantı noktasını kullanırsanız URL'deki bağlantı noktası numarasına ihtiyacınız yoktur. Peki bu sorunu nasıl çözüyor?
RalfFriedl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.