Kesalahan Heroku + node.js (Proses web gagal mengikat $ PORT dalam 60 detik sejak peluncuran)

447

Saya memiliki aplikasi node.js pertama saya (berjalan dengan baik secara lokal) - tetapi saya tidak dapat menggunakan via heroku (pertama kali juga w / heroku). Kode di bawah. SO tidak membiarkan saya menulis begitu banyak kode, jadi saya hanya akan mengatakan bahwa menjalankan kode secara lokal juga dalam jaringan saya tidak menunjukkan masalah.

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

Ada ide ?

pengguna428900
sumber
Bisakah Anda memposting kode Anda di sini? Lebih disukai bagian .listen () jika Anda memulai server http
Benjamin Gruenbaum

Jawaban:

987

Heroku secara dinamis memberikan port aplikasi kepada Anda, sehingga Anda tidak dapat mengatur port ke nomor yang tetap. Heroku menambahkan port ke env, sehingga Anda dapat menariknya dari sana. Alihkan pendengaran Anda ke ini:

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

Dengan begitu ia masih akan mendengarkan port 5000 ketika Anda menguji secara lokal, tetapi itu juga akan berfungsi pada Heroku.

Anda dapat memeriksa dokumen Heroku di Node.js di sini .

redhotvengeance
sumber
96
penting bahwa Anda menggunakan process.env.PORT dan bukan process.env.port.
gprasant
Cantik! bekerja untuk saya dengan modul 'websocket'.
philx_x
1
Terima kasih telah menghemat waktu saya.
allsoft
2
Terima kasih, bekerja untuk saya juga. Saya terkejut ini tidak dibuat lebih jelas dalam dokumen Heroku
sidarcy
34

Kesalahan terjadi ketika Heroku gagal mengikat port atau nama host di server.listen(port, [host], [backlog], [callback]).

Yang dibutuhkan oleh Heroku adalah .listen(process.env.PORT)atau.listen(process.env.PORT, '0.0.0.0')

Jadi lebih umum, untuk mendukung lingkungan lain, gunakan ini:

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);
});
Royce Lee
sumber
6
Dengan panggilan berikut: app.listen (serverPort, "localhost", function (err) {Heroku gagal. Mengubah "localhost" ke "0.0.0.0" membantu. Terima kasih!
pubsy
31

Perlu disebutkan bahwa jika kode Anda tidak menentukan port, maka itu tidak boleh menjadi webproses dan mungkin harus menjadiworker proses.

Jadi, ubah Anda Procfileuntuk membaca (dengan perintah spesifik Anda telah diisi):

worker: YOUR_COMMAND

dan kemudian juga berjalan di CLI:

$ heroku scale worker=1

zthomas.nc
sumber
1
Saya memiliki masalah yang sama saya bisa menyelesaikan masalah dengan mengganti 'localhost' dengan IP yaitu '0.0.0.0'
Damith Asanka
2
Saya menjalankan bot Discord pada Heroku, dan ini membuat saya untuk loop. Slack, Hipchat, dll. Bot mungkin memiliki masalah serupa.
Skylar
1
Jika Anda memilih rute ini, pastikan untuk pergi ke tab Resources, matikan proses web dan nyalakan proses pekerja. Dengan begitu Heroku tidak akan mengharapkan port mengikat.
Isaac Lyman
1
Ohh terima kasih banyak. Aku jadi gila mencoba mencari ini. Saya tidak tahu aplikasi web dan pekerja berbeda di Heroku dalam hal Procfile. Perlu disebutkan bahwa mereka membutuhkan saya untuk menambahkan startskrip dipackage.json
Rishav
1
Dalam kasus saya, saya mengubah procfile dari web ke pekerja. Berhasil !! Thkns
rodrigorf
27

Saya memiliki masalah yang sama ketika menggunakan proyek yang dihasilkan angular-fullstack yeoman dan menghapus parameter IP bekerja untuk saya.

Saya mengganti kode ini

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

dengan

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

Bagi mereka yang melewati port dan host, perlu diingat bahwa Heroku tidak akan terikat localhost .

Anda harus lulus 0.0.0.0 sebagai tuan rumah.

Bahkan jika Anda menggunakan port yang benar. Kami harus melakukan penyesuaian ini:

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

Kemudian Anda dapat memulai server, seperti biasa:

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

Anda dapat melihat detail lebih lanjut di sini: https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error

gregb
sumber
3
Jawaban ini tidak hanya lebih lengkap, tetapi satu-satunya yang menargetkan dua masalah yang mungkin. Dalam kasus saya konfigurasi port sudah benar, tetapi bukan alamat mendengarkan. Ini harus menjadi jawaban yang diterima.
Danielo515
Dalam kasus saya ini berfungsi saat saya berubah seperti di bawah ini const port = 3000;untuk const port = process.env.PORT || 3000; bekerja pada heroku
vpgodara
satu-satunya hal yang benar-benar bekerja untuk saya, terima kasih
Ibrahim Mohammed
10

Dalam kasus saya, saya menggunakan contoh dari https://hapijs.com/

Untuk memperbaiki masalah saya diganti

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

dengan

server.connection({
    port: process.env.PORT || 3000 
});
nexuzzz
sumber
dan bagi mereka yang menggunakan menentukan process.env.PORTdengan benar, tetapi meninggalkan di hostparam: Anda tidak bisa :) lihat di sini: stackoverflow.com/a/34956330/626369
Dominick
3

Saya memiliki masalah yang sama dan mengubah port mendengarkan saya dari 3000 menjadi (process.env.PORT || 5000) menyelesaikan masalah !!

Akshata Dabade
sumber
2

Dalam kasus saya, saya menggunakan Babel dengan plugin babel-plugin-transform-inline-environment-variable . Rupanya, Heroku tidak mengatur variabel PORT env saat melakukan penempatan, jadi process.env.PORTakan digantikan oleh undefined, dan kode Anda akan mundur ke port pengembangan yang Heroku tidak tahu apa-apa tentang.

Edgar Ortega
sumber
1

Langkah-langkah di bawah ini menyelesaikan solusi saya:

Mengedit package.json sebagai:

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

dan Server.js sebagai:

...
var port = process.env.PORT || 3000;
app.listen(port, "0.0.0.0", function() {
console.log("Listening on Port 3000");
});
...
Naveen Kumar V
sumber
Dalam kasus saya, saya mengambil bagian dari package.json. Saya percaya memperbarui itu juga harus menyelesaikan masalah ini.
Tandai
1

Saya memiliki masalah yang sama karena saya tidak mendefinisikan Procfile. Mengkomit file teks ke direktori root aplikasi Anda yang bernama Procfile tanpa ekstensi file. File ini memberi tahu Heroku perintah mana yang harus dijalankan untuk memulai aplikasi Anda.
web: node app.js

AmirRezaM75
sumber
Terima kasih, saya lupa melakukan ini. Tanpa file ini, heroku mengabaikan file sepenuhnya.
Vladimir Despotovic
0

Saya memiliki masalah yang sama yang dapat saya atasi dengan mengganti 'localhost' dengan IP yaitu '0.0.0.0'

Damith Asanka
sumber
0

Nomor tetap tidak dapat diatur untuk port, heroku menugaskannya menggunakan secara dinamis process.env.PORT. Tetapi Anda dapat menambahkan keduanya, seperti ini process.env.PORT || 5000. Heroku akan menggunakan yang pertama, dan localhost Anda akan menggunakan yang kedua.

Anda bahkan dapat menambahkan fungsi panggilan balik Anda. Lihatlah kode di bawah ini

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

Dari semua solusi yang saya coba tidak ada yang bekerja seperti yang diharapkan, saya mempelajari heroku secara default File .env harus memelihara PORT konvensi, process.env.PORT, heroku secara default akan mencari PORT Kata Kunci.

Batalkan pengubahan nama seperti APP_PORT = alih-alih gunakan PORT = dalam file env Anda.

Delino
sumber
0

Dari proses bash heroku, turunkan nilai $ PORT ke aplikasi node Anda menggunakan parser opsi seperti yargs.

Berikut adalah contoh bagaimana Anda bisa melakukan itu. Pada objek skrip, di dalam package.json, tambahkan metode mulai "node server --port $ PORT".

Di file server Anda, gunakan yargs untuk mendapatkan nilai dari opsi port (--port $ PORT) dari metode awal:

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

Sekarang ketika aplikasi Anda mulai, itu akan mengikat ke nilai yang ditetapkan secara dinamis $ PORT.

Aori Nevo
sumber
0

Jika, seperti saya, Anda mengonfigurasi Heroku untuk menjalankan skrip dari package.jsonfile Anda saat digunakan, pastikan Anda belum mengkodekan nilai PORTdalam skrip itu! Jika ya, Anda akan berakhir seperti saya dan menghabiskan satu jam mencoba mencari tahu mengapa Anda mendapatkan kesalahan ini.

Chris
sumber
0

Saya memiliki masalah yang sama tetapi dengan express dan apollo-server. Solusi dari sini :

Satu-satunya pertimbangan khusus yang perlu dibuat adalah untuk memungkinkan heroku memilih port yang digunakan server. Jika tidak, mungkin ada kesalahan, seperti batas waktu permintaan.

Untuk mengkonfigurasi apollo-server untuk menggunakan port yang ditentukan oleh Heroku saat runtime, fungsi mendengarkan dalam file setup Anda dapat dipanggil dengan port yang ditentukan oleh variabel lingkungan PORT:

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

Dalam kasus saya, saya memiliki dua masalah ...

1) tidak ada pendengar sama sekali karena menjalankan aplikasi dari file entri lain dan skrip run ini dihapus dari package.json "skrip"

masukkan deskripsi gambar di sini

2) Masalah sensitif huruf dengan 'Sekuel' dan bukan 'sekuel'

masukkan deskripsi gambar di sini

Elmatsidis Paul
sumber
0

Saya memiliki masalah yang sama. Akhirnya, saya menyadari bahwa saya tidak memerlukan nomor port di titik akhir permintaan. (jadi titik akhirnya adalah https: //...herokuapp.com dan bukan https: //...herokuapp.com: 5000 ).

Panggilan Listen () bisa tanpa host dan callback: server.listen (5000);

Shai Fisher
sumber
Anda tidak perlu nomor port di URL jika Anda menggunakan port default. Jadi bagaimana cara mengatasi masalah?
RalfFriedl
0

Dalam kasus saya, baik port maupun host adalah masalahnya. Index.js kami dibagi menjadi 2 file 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)
});

dari package.json kami menjalankan node app.js

Rupanya itulah masalahnya. Setelah saya menggabungkan keduanya menjadi satu file aplikasi heroku dikerahkan seperti yang diharapkan.

Semoga ini bisa membantu seseorang karena saya tidak menemukan orang yang mengalami masalah ini

jonyB
sumber
0

Saya Menggunakan ReactJs, Jika Anda ingin mengunggah ke heroku, tambahkan ini di webpack.config.js Anda

Karena jika tidak menambahkan Anda akan mengalami kesalahan

Kesalahan R10 (Waktu tunggu booting) -> Proses web gagal untuk mengikat $ PORT dalam 60 detik peluncuran

//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
 })
 ]
};
NUR CHULIS
sumber
0

Kredit untuk: gprasant

Saya hanya ingin memposting ulang karena jawaban ini memperbaiki masalah saya. Masalah saya adalah bahwa ketika melakukan penyebaran ke heroku saya mendapat kesalahan "Proses web gagal untuk mengikat $ PORT dalam 60 detik peluncuran" ketika menjalankan "heroku log --tail" di terminal. TAPI aplikasi akan berjalan seperti yang diharapkan ketika saya menjalankan server secara lokal.

Saya punya ini di file index.js saya (file server)

const PORT = process.env.port || 4000

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

Tetapi seharusnya memiliki ini

const PORT = process.env.PORT || 4000

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

Gunakan process.env.PORT bukan process.env.port !!!! port! = PORT !!! (jelas)

Kredit untuk: gprasant

Josh Kardos
sumber