首页 > 解决方案 > 尽管使用了 process.env.PORT,但我的节点 js 部署的应用程序默认为 3000

问题描述

我正在尝试部署我的 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.....`);
});

我的 connection.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 上运行并且不会打开主页。我知道它还不会连接到数据库,我只想让应用程序首先运行。

我真的无法理解我做错了什么。但我怀疑在控制台中创建环境变量时我做错了什么。

标签: node.jsenvironment-variablesport

解决方案


在我们的服务器上,实际上有两种部署 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 个客户端的应用程序不可能在同一端口上运行。因此,如果您选择手动设置端口,您可能很难找到空闲端口,这当然取决于您的帐户所在的服务器。


推荐阅读