尽管使用了process.env.PORT,我的节点js部署的应用程序默认仍为3000

时间:2018-10-08 08:44:49

标签: node.js environment-variables 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.....`);
});

我的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上运行并且不会打开主页时,请看一下。我知道它还不会连接到数据库,我只希望该应用首先运行。

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

2 个答案:

答案 0 :(得分:1)

在我们的服务器上,实际上有两种部署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变量(如果未定义),并且它的实现方式是两个客户端的应用程序无法在同一端口上运行。因此,如果您选择手动设置端口,则可能会难于找到空闲端口,具体取决于托管帐户的服务器。

答案 1 :(得分:0)

我一定做错了。我为该应用程序创建了一个新文件夹。然后,我复制了所有文件,然后执行了新的git init和npm init。然后,我做了npm的安装和部署,一切正常。为什么,我不能说,但是奏效了。