簡體   English   中英

盡管使用 process.env.PORT,我的節點 js 部署的應用程序默認為 3000

[英]My node js deployed app defaults to 3000 despite using process.env.PORT

我正在嘗試部署我的 Node 應用程序。 在 app.listen 我使用 process.env.PORT 但我的服務提供者一直告訴我我的應用程序只在端口 3000 上運行。

我徒勞地搜索了幾個小時,無法弄清楚我做錯了什么。 我的APP.JS

const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const app = express();
var expressValidator = require('express-validator');
var cookieParser = require('cookie-parser');
var connection = require('./routes/connection');
var bcrypt = require('bcrypt');

var session = require('express-session');
var passport = require('passport');
var MySQLStore = require('express-mysql-session')(session);
var LocalStrategy = require('passport-local').Strategy;

var clientRoutes        = require('./routes/clients'),
dashboardRoutes      = require('./routes/dashboard'),
carerRoutes         = require('./routes/carers'),
indexRoutes         = require('./routes/index'),
shiftRoutes         = require('./routes/shifts'),
timesheetRoutes     = require('./routes/timesheets'),
reportRoutes        = require('./routes/reports'),
graphRoutes         = require('./routes/graph'),
adminRoutes         = require('./routes/admin'),
registerRoutes      = require('./routes/register');

app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({extended: true}));
app.use(expressValidator());//immedietely after body parser
app.use(cookieParser());
app.use("/public", express.static(path.join(__dirname, 'public')));

var options = {
    host: DATABASE_LOCATION,
    user: DATABASE_USER,
    database: DATABASE_NAME,
    password: DATABASE_PASSWORD,
    multipleStatements: true //for more than one query in a get route
};

var sessionStore = new MySQLStore(options);

app.use(session({
  secret: '12fgsgsdfadfafafasfss',
  resave: false,
  store: sessionStore,
  saveUninitialized: false
  // cookie: { secure: true }
}))

app.use(passport.initialize());
app.use(passport.session());

passport.use(new LocalStrategy(
function(username, password, done) {
    // console.log(username);
    // console.log(password);


 connection.query('select id, password from users where username = ?', [username], function(err, results, fields){
      if (err) { done(err)};
      if (results.length === 0) {
        done(null, false);
      } else {
        const hash = results[0].password.toString();
        var user_id = results[0].id;

        bcrypt.compare(password, hash , function(err, response){
          if (response) {
            return done(null, {user_id: user_id});
          } else {
            return done(null, false);
          };
        });
      };
    }); 
  }));

app.use(indexRoutes);
app.use(dashboardRoutes);
app.use(carerRoutes);
app.use(clientRoutes);
app.use(shiftRoutes);
app.use(timesheetRoutes);
app.use(reportRoutes);
app.use(graphRoutes);
app.use(adminRoutes);
app.use(registerRoutes);



app.listen(process.env.PORT, process.env.IP, function(){
   console.log(`Wayne's server started.....`);
});

我的連接.js

var express = require('express');
var router = express.Router();
const mysql = require('mysql');

const connection = mysql.createConnection({
  host: DATABASE_LOCATION,
  user: DATABASE_USER,
  database: DATABASE_NAME,
  password: DATABASE_PASSWORD,
  multipleStatements: true //for more than one query in a get route
});

module.exports = connection;

我嘗試部署到不同的主機,當我查看日志時,發現它在端口 3000 上運行並且不會打開主頁。 我知道它還不會連接到數據庫,我只是想讓應用程序先運行。

我真的無法理解我做錯了什么。 但是我懷疑在控制台中創建環境變量時我做錯了什么。

在我們的服務器上,實際上有兩種部署 NodeJS 應用程序的方法。


第一個確實按照@Alpe89 的建議使用了我們的 NodeJS 選擇器。

選擇器服務面向在不同 NodeJS 版本上運行多個 NodeJS 應用程序的客戶。 選擇器與 Apache Mod Passenger 一起工作,它為每個部署的應用程序創建一個虛擬環境。

這意味着對於每個應用程序,您可以使用不同的環境變量,甚至可以使用相同的環境變量,但為它們設置不同的值。

要為使用 NodeJS 選擇器創建的應用程序實際配置環境變量,您應該使用包含在選擇器功能中的相同方式調用:

https://www.screencast.com/t/uh4dVAo1VM2J


第二種是直接使用服務器上默認運行的固定NodeJS版本。

這將允許您通過以下命令使用 SSH 直接設置環境變量:

export SOME_ENV_VAR="Some value"

您也可以直接使用 Javascript 文件中的以下代碼在 env 對象中設置環境變量:

process.env.PORT= 3001;

但是,使用默認的 NodeJS 服務運行應用程序意味着您應該從 SSH 中啟動應用程序。 我們在這里詳細描述了這一點:

https://www.fastcomet.com/tutorials/nodejs/pm2


總之,無論您使用哪種方法,定義端口實際上都是正確和錯誤的。 原因純粹是因為 NodeJS 的共享托管的工作方式。 在同一台服務器上托管多個客戶端應用程序意味着每個應用程序都應該在不同的端口上運行。 如果未定義,NodeJS 選擇器功能實際上會提供 PORT 變量,並且它的實現方式使 2 個客戶端的應用程序不可能在同一端口上運行。 因此,如果您選擇手動設置端口,您可能很難找到空閑端口,這取決於您的帳戶所在的服務器。

我一定是做錯了什么。 我為應用程序創建了一個新文件夾。 然后我復制了所有文件,然后做了一個新的 git init 和 npm init。 然后我安裝並部署了 npm,一切正常。 為什么,我不能說,但它奏效了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM