繁体   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