ข้อผิดพลาด Heroku + node.js (กระบวนการทางเว็บไม่สามารถผูกติดกับ $ PORT ได้ภายใน 60 วินาทีหลังจากเปิดตัว)


447

ฉันมีแอป node.js แรกของฉัน (ทำงานได้ในท้องถิ่น) - แต่ฉันไม่สามารถปรับใช้ผ่าน heroku (ครั้งแรกที่มี w / 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/');

ความคิดใด ๆ


คุณช่วยโพสต์รหัสของคุณได้ไหม โดยเฉพาะอย่างยิ่ง. listen () ส่วนหนึ่งถ้าคุณเริ่มต้นเซิร์ฟเวอร์ http
Benjamin Gruenbaum

คำตอบ:


989

Heroku กำหนดพอร์ตให้แอปของคุณแบบไดนามิกดังนั้นคุณจึงไม่สามารถตั้งค่าพอร์ตเป็นหมายเลขคงที่ได้ Heroku เพิ่มพอร์ตให้กับ env เพื่อให้คุณสามารถดึงมันออกมาจากที่นั่น เปลี่ยนการฟังของคุณเป็น:

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

ด้วยวิธีนี้มันจะยังฟังพอร์ต 5000 เมื่อคุณทดสอบในเครื่อง แต่จะทำงานกับ Heroku

คุณสามารถตรวจสอบเอกสาร Heroku ใน Node.js ที่นี่


97
สำคัญที่คุณต้องใช้ process.env.PORT และไม่ใช่ process.env.port
gprasant

สวย! ทำงานให้ฉันด้วยโมดูล 'websocket'
philx_x

2
นี่คือตัวอย่าง: github.com/heroku/node-js-getting-started/blob/master/index.js
Pablo

2
ขอบคุณทำงานให้ฉันด้วย ฉันประหลาดใจที่เอกสารนี้ไม่ชัดเจนในเอกสารของ Heroku
sidarcy

@redhotvengeance ขอบคุณ .. พูดถึงมันเป็นตัวพิมพ์เล็กและประหยัดทั้งวัน :)
Mahendran

34

ข้อผิดพลาดที่เกิดขึ้นเมื่อ 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);
});

6
ด้วยการโทรดังต่อไปนี้: app.listen (serverPort, "localhost", ฟังก์ชั่น (ผิดพลาด) {Heroku ล้มเหลวสลับเป็น "localhost" เป็น "0.0.0.0" ช่วยด้วยขอบคุณ!
pubsy

31

เป็นมูลค่าการกล่าวขวัญว่าถ้ารหัสของคุณไม่ได้ระบุพอร์ตก็ไม่ควรเป็นwebกระบวนการและอาจจะเป็นworkerกระบวนการแทน

ดังนั้นเปลี่ยนProcfileเป็นอ่าน (ด้วยคำสั่งเฉพาะของคุณกรอก):

worker: YOUR_COMMAND

จากนั้นเรียกใช้บน CLI ด้วย:

heroku scale worker=1

1
ฉันมีปัญหาเดียวกันฉันสามารถแก้ไขปัญหาด้วยการแทนที่ 'localhost' ด้วย IP ซึ่งเป็น '0.0.0.0'
Damith Asanka

2
ฉันใช้บอท Discord บน Heroku และนี่ทำให้ฉันสับสน หย่อน, Hipchat, ฯลฯ บอทน่าจะมีปัญหาที่คล้ายกัน
Skylar

1
หากคุณไปเส้นทางนี้ตรวจสอบให้แน่ใจว่าได้ไปที่แท็บทรัพยากรปิดกระบวนการทางเว็บและเปิดใช้กระบวนการของผู้ปฏิบัติงาน ด้วยวิธีนี้ Heroku จะไม่คาดหวังว่าจะมีผลผูกพันพอร์ต
Isaac Lyman

1
โอ้ขอบคุณมาก ฉันพยายามที่จะค้นหามัน ฉันไม่รู้ว่าแอปพลิเคชั่นเว็บและผู้ปฏิบัติงานแตกต่างกันใน Heroku ในแง่ของ Procfile เป็นมูลค่าการกล่าวขวัญว่าพวกเขาต้องการให้ฉันเพิ่มstartสคริปต์ในของฉันpackage.json
Rishav

1
ในกรณีของฉันฉันเปลี่ยน procfile จากเว็บเป็นคนงาน มันได้ผล !! Thkns
rodrigorf

27

ฉันมีปัญหาเดียวกันในขณะที่ใช้โครงการสร้างมุมเชิงมุมของ Yeoman และลบพารามิเตอร์ 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'));
});

25

สำหรับผู้ที่จะผ่านทั้งสองพอร์ตและโฮสต์ที่เก็บไว้ในใจว่า 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


3
คำตอบนี้ไม่เพียง แต่สมบูรณ์มากขึ้นเท่านั้น ในกรณีของฉันการกำหนดค่าพอร์ตถูกต้อง แต่ไม่ใช่ที่อยู่การฟัง นี่ควรเป็นคำตอบที่ยอมรับได้
Danielo515

ในกรณีของฉันมันใช้งานได้เมื่อฉันเปลี่ยนแปลงด้านล่าง const port = 3000;เพื่อconst port = process.env.PORT || 3000; ใช้กับ heroku
vpgodara

สิ่งเดียวที่ใช้ได้ผลจริงสำหรับฉันขอบคุณ
อิบราฮิมโมฮัมเหม็ด

10

ในกรณีของฉันฉันใช้ตัวอย่างจากhttps://hapijs.com/

เพื่อแก้ไขปัญหาที่ฉันเปลี่ยน

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

กับ

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

และสำหรับผู้ใช้ที่ระบุprocess.env.PORTอย่างถูกต้อง แต่ทิ้งไว้ในhostพารามิเตอร์: คุณไม่สามารถ :) ดูได้ที่นี่: stackoverflow.com/a/34956330/626369
Dominick


2

ในกรณีของผมใช้บาเบลกับBabel-ปลั๊กอินเปลี่ยน-อินไลน์สิ่งแวดล้อมตัวแปรปลั๊กอิน เห็นได้ชัดว่า Heroku ไม่ได้ตั้งค่าตัวแปร env PORT เมื่อทำการปรับใช้ดังนั้นprocess.env.PORTจะถูกแทนที่ด้วยundefinedและรหัสของคุณจะกลับไปที่พอร์ตการพัฒนาซึ่ง Heroku ไม่ทราบอะไรเกี่ยวกับ


1

แก้ไขpackage.json:

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

และServer.js:

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

package.jsonในกรณีของฉันฉันเอาออกส่วนหนึ่งของที่ ฉันเชื่อว่าการอัปเดตควรแก้ปัญหานี้ด้วย
Mark

1

Procfileฉันมีปัญหาเดียวกันเพราะผมไม่ได้กำหนด ส่งไฟล์ข้อความไปยังไดเรกทอรีรากของแอปของคุณที่ชื่อProcfile โดยไม่มีนามสกุลไฟล์ ไฟล์นี้จะบอก Heroku ว่าคำสั่งใดให้เรียกใช้เพื่อเริ่มแอปของคุณ

web: node app.js

ขอบคุณฉันลืมทำสิ่งนี้ หากไม่มีไฟล์นี้ heroku จะไม่สนใจไฟล์ทั้งหมด
Vladimir Despotovic

0

ฉันมีปัญหาเดียวกันฉันสามารถแก้ไขปัญหาด้วยการแทนที่ 'localhost' ด้วย IP ซึ่งเป็น '0.0.0.0'


0

จำนวนคงไม่สามารถตั้งค่าสำหรับพอร์ต, Heroku process.env.PORTกำหนดว่ามันแบบไดนามิกโดยใช้ process.env.PORT || 5000แต่คุณสามารถเพิ่มพวกเขาทั้งสองแบบนี้ Heroku จะใช้อันแรกและ localhost ของคุณจะใช้อันที่สอง

คุณสามารถเพิ่มฟังก์ชั่นการโทรกลับ ดูรหัสด้านล่าง

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

0

ในการแก้ปัญหาทั้งหมดที่ฉันได้ลองใช้งานไม่เป็นไปตามที่คาดไว้ฉันศึกษา heroku โดยค่าเริ่มต้นไฟล์. env ควรรักษาการประชุม PORT, process.env.PORT, heroku โดยค่าเริ่มต้นจะค้นหา PORT คำหลัก

ยกเลิกการเปลี่ยนชื่อใด ๆ เช่น APP_PORT = แทนที่จะใช้ PORT = ในไฟล์ env ของคุณ


0

จากกระบวนการทุบตี heroku ส่งค่า $ PORT ไปยังแอปโหนดของคุณโดยใช้ตัวแยกวิเคราะห์ตัวเลือกเช่น yargs

นี่คือตัวอย่างของวิธีที่คุณอาจทำเช่นนั้น บนอ็อบเจ็กต์สคริปต์ภายใน package.json ให้เพิ่มวิธีการเริ่มต้น "node server --port $ PORT"

ในไฟล์เซิร์ฟเวอร์ของคุณใช้ yargs เพื่อรับค่าจากตัวเลือกพอร์ต (- พอร์ต $ PORT) ของวิธีการเริ่มต้น:

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

ตอนนี้เมื่อแอปของคุณเริ่มทำงานแอปจะเชื่อมโยงกับค่าที่ตั้งแบบไดนามิกของ $ PORT


0

ถ้าอย่างฉันคุณกำลังกำหนดค่า Heroku ให้เรียกใช้สคริปต์จากpackage.jsonไฟล์ของคุณในการปรับใช้ตรวจสอบให้แน่ใจว่าคุณไม่ได้กำหนดค่าPORTในสคริปต์นั้นอย่างหนัก! หากคุณเป็นเช่นนั้นคุณจะจบลงเหมือนฉันและใช้เวลาหนึ่งชั่วโมงเพื่อหาสาเหตุที่คุณได้รับข้อผิดพลาดนี้


0

ฉันมีปัญหาเดียวกัน แต่มีด่วนและเซิร์ฟเวอร์อพอลโล ทางออกจากที่นี่ :

การพิจารณาเป็นพิเศษเพียงอย่างเดียวที่จำเป็นต้องทำคืออนุญาตให้ heroku เลือกพอร์ตที่เซิร์ฟเวอร์ถูกปรับใช้ มิฉะนั้นอาจมีข้อผิดพลาดเช่นคำขอหมดเวลา

ในการกำหนดค่า apollo-server ให้ใช้พอร์ตที่กำหนดโดย Heroku เมื่อรันไทม์ฟังก์ชั่น Listen ในไฟล์ติดตั้งของคุณสามารถเรียกได้ด้วยพอร์ตที่กำหนดโดยตัวแปรสภาพแวดล้อม PORT:

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

0

ในกรณีของฉันฉันมีสองประเด็น ...

1) ไม่มีผู้ฟังเลยเนื่องจากการเรียกใช้แอปจากไฟล์รายการอื่นและสคริปต์การทำงานนี้ถูกลบจาก package.json "สคริปต์"

ป้อนคำอธิบายรูปภาพที่นี่

2) ปัญหาเกี่ยวกับตัวพิมพ์เล็กและใหญ่ด้วย 'Sequelize' แทน 'sequelize'

ป้อนคำอธิบายรูปภาพที่นี่


0

ฉันใช้ ReactJs หากคุณต้องการอัปโหลดไปยัง heroku เพิ่มสิ่งนี้ใน webpack.config.js

เพราะถ้าไม่เพิ่มคุณจะมีข้อผิดพลาด

ข้อผิดพลาด R10 (การหมดเวลาบูต) -> กระบวนการทางเว็บล้มเหลวในการผูกเข้ากับ $ PORT ภายใน 60 วินาทีของการเปิดตัว

//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

ในกรณีของฉันพอร์ตหรือโฮสต์ไม่เป็นปัญหา index.jsแบ่งออกเป็น 2 ไฟล์ 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)
});

จากpackage.jsonเราวิ่งnode app.jsที่เราวิ่ง

เห็นได้ชัดว่าเป็นปัญหา เมื่อฉันรวมทั้งสองเป็นไฟล์เดียวแอป Heroku ก็ถูกนำไปใช้งานอย่างที่คาดไว้


0

ปัญหาของฉันคือเมื่อปรับใช้กับ heroku ฉันพบข้อผิดพลาด:

กระบวนการทางเว็บล้มเหลวในการผูกติดกับ $ PORT ภายใน 60 วินาทีของการเปิดตัว

เมื่อทำงาน heroku logs --tailในเครื่อง แต่แอปพลิเคชันจะทำงานตามที่คาดไว้เมื่อฉันเรียกใช้เซิร์ฟเวอร์ในเครื่อง

ฉันมีสิ่งนี้ในindex.jsไฟล์ของฉัน(ไฟล์เซิร์ฟเวอร์)

const PORT = process.env.port || 4000

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

แต่ควรมีสิ่งนี้

const PORT = process.env.PORT || 4000

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

ใช้process.env.PORTไม่ใช่process.env.portเพราะportไม่เหมือนกันPORTอย่างเห็นได้ชัด

เครดิตgprasant


0

ฉันรู้ว่าฉันไม่จำเป็นต้องหมายเลขพอร์ตในปลายทางคำขอเพื่อให้ปลายทางได้และไม่ได้herokuapp.comherokuapp.com:5000

การlisten()โทรสามารถไม่มีโฮสต์และการโทรกลับ:

server.listen(5000);

คุณไม่ต้องการหมายเลขพอร์ตใน URL หากคุณใช้พอร์ตเริ่มต้น แล้วมันจะแก้ปัญหาอย่างไร
RalfFriedl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.