繁体   English   中英

从应用程序收到的不完整响应 + 状态代码 502:如何将 Node.js 快速应用程序和 MongoDB 数据库与 Phusion 乘客连接?

[英]Incomplete Response Received From Application + Status Code 502: How to Connect Node.js Express Application & MongoDB database with Phusion Passenger?

我的 Node.js/Express & MongoDB 应用程序在本地运行良好。

但是,它不适用于生产模式

事实上,我正在使用 o2switch 托管,它通过 cPanel 使用Phusion Passenger

我认为问题是我的 MongoDB 数据库不再连接到我的应用程序,因为 Passenger 提供了以下用于连接的片段:

if (typeof(PhusionPassenger) !== 'undefined') {
    PhusionPassenger.configure({ autoInstall: false });
}
 
var express = require('express');
var app = express();
app.get('/', function(req, res) {
    var body = 'Hello World';
    res.setHeader('Content-Type', 'text/plain');
    res.setHeader('Content-Length', body.length);
    res.end(body);
});
 
if (typeof(PhusionPassenger) !== 'undefined') {
    app.listen('passenger');
} else {
    app.listen(3000);
}

事实上,我尝试自定义此快照并使其适应我的代码,但我无法做到。

如下所示,我无法在 Passenger 代码中实现与 MongoDB 数据库相关的代码:

if (typeof(PhusionPassenger) !== 'undefined') {
    PhusionPassenger.configure({ autoInstall: false });
}

if (typeof(PhusionPassenger) !== 'undefined') {
    app.listen('passenger');
} else {
    app.listen(3000);
}

db.connectToDatabase()
  .then(function () {
    app.listen(port);
  })
  .catch(function (error) {
    console.log('La connexion à la base de données a échoué !');
  });

在浏览器上,显示以下错误消息:

从应用程序收到的不完整响应

当我控制台日志时,它说这是一个状态代码 502错误。

这是我与 MongoDB 数据库相关的代码,用于在本地运行我的应用程序:

数据库.js:

const mongodb = require('mongodb');

const MongoClient = mongodb.MongoClient;

let database;

async function connect() {
  const client = await MongoClient.connect('mongodb://127.0.0.1:27017');
  database = client.db('com4muz-blog');
}

function getDb() {
  if (!database) {
    throw { message: 'Database connection not established!' };
  }
  return database;
}

module.exports = {
  connectToDatabase: connect,
  getDb: getDb
};

应用程序.js:

const path = require('path');

const express = require('express');
const session = require('express-session');

const sessionConfig = require('./config/session');

const db = require('./data/database');

const adminRoutes = require('./routes/admin/blog');
const authRoutes = require('./routes/admin/auth');

const defaultRoutes = require('./routes/home/default');
const postsRoutes = require('./routes/home/posts');
const quotationsRoutes = require('./routes/home/quotations');
const contactsRoutes = require('./routes/home/contacts');

const authMiddleware = require('./middlewares/auth-middleware');

const mongoDbSessionStore = sessionConfig.createSessionStore(session);

const app = express();

app.set('views', [
  path.join(__dirname, 'views/home'),
  path.join(__dirname, 'views/admin')
]);
app.set('view engine', 'ejs');

app.use(express.static('public'));
app.use('/public/admin/images', express.static('public/admin/images'));

app.use(express.urlencoded({ extended: true }));
app.use(express.json());

app.use(session(sessionConfig.createSessionConfig(mongoDbSessionStore)));

app.use(authMiddleware);

app.use('/', adminRoutes);
app.use('/', authRoutes);

app.use('/', defaultRoutes);
app.use('/', postsRoutes);
app.use('/', quotationsRoutes);
app.use('/', contactsRoutes);

app.use(function (req, res) {
  res.status(404).render('404');
});

app.use(function (error, req, res, next) {
  console.error(error);
  res.status(500).render('500');
});

db.connectToDatabase().then(function () {
  app.listen(3000);
});

现在,这是我用来通过Phusion Passenger在生产模式下运行我的应用程序的代码:

数据库.js:

const mongodb = require('mongodb');

const MongoClient = mongodb.MongoClient;

let database;

let mongodbUrl = 'mongodb://127.0.0.1:27017';
let MONGODB_URL = 'mongodb+srv://<username>:<password>@cluster0.42o6qd6.mongodb.net/?retryWrites=true&w=majority'

if (process.env.MONGODB_URL) {
  mongodbUrl = process.env.MONGODB_URL;
}

async function connect() {
  const client = await MongoClient.connect(mongodbUrl);
  database = client.db('com4muz-blog');
}

function getDb() {
  if (!database) {
    throw { message: 'Database connection not established!' };
  }
  return database;
}

module.exports = {
  connectToDatabase: connect,
  getDb: getDb
};

应用程序.js:

const path = require('path');

const express = require('express');
const session = require('express-session');

const sessionConfig = require('./config/session');

const db = require('./data/database');

const adminRoutes = require('./routes/admin/blog');
const authRoutes = require('./routes/admin/auth');

const defaultRoutes = require('./routes/home/default');
const postsRoutes = require('./routes/home/posts');
const quotationsRoutes = require('./routes/home/quotations');
const contactsRoutes = require('./routes/home/contacts');

const authMiddleware = require('./middlewares/auth-middleware');

const mongoDbSessionStore = sessionConfig.createSessionStore(session);

let port = 3000;

if (process.env.MONGODB_URL) {
  port = process.env.MONGODB_URL;
}

const app = express();

app.set('views', [
  path.join(__dirname, 'views/home'),
  path.join(__dirname, 'views/admin')
]);
app.set('view engine', 'ejs');

app.use(express.static('public'));
app.use('/public/admin/images', express.static('public/admin/images'));

app.use(express.urlencoded({ extended: true }));
app.use(express.json());

app.use(session(sessionConfig.createSessionConfig(mongoDbSessionStore)));

app.use(authMiddleware);

app.use('/', adminRoutes);
app.use('/', authRoutes);

app.use('/', defaultRoutes);
app.use('/', postsRoutes);
app.use('/', quotationsRoutes);
app.use('/', contactsRoutes);

app.use(function (req, res) {
  res.status(404).render('404');
});

app.use(function (error, req, res, next) {
  console.error(error);
  res.status(500).render('500');
});

if (typeof(PhusionPassenger) !== 'undefined') {
    PhusionPassenger.configure({ autoInstall: false });
}

if (typeof(PhusionPassenger) !== 'undefined') {
    app.listen('passenger');
} else {
    app.listen(3000);
}

// db.connectToDatabase()
//   .then(function () {
//     app.listen(port);
//   })
//   .catch(function (error) {
//     console.log('La connexion à la base de données a échoué !');
//   });

如您所见,代码似乎无法连接到数据库。

但是,我无法通过 Passenger 找到正确的代码,尽管我尝试如下:

应用程序.js:

const path = require('path');

const express = require('express');
const session = require('express-session');

const sessionConfig = require('./config/session');

const db = require('./data/database');

const adminRoutes = require('./routes/admin/blog');
const authRoutes = require('./routes/admin/auth');

const defaultRoutes = require('./routes/home/default');
const postsRoutes = require('./routes/home/posts');
const quotationsRoutes = require('./routes/home/quotations');
const contactsRoutes = require('./routes/home/contacts');

const authMiddleware = require('./middlewares/auth-middleware');

const mongoDbSessionStore = sessionConfig.createSessionStore(session);

let port = 3000;

if (process.env.MONGODB_URL) {
  port = process.env.MONGODB_URL;
}

const app = express();

app.set('views', [
  path.join(__dirname, 'views/home'),
  path.join(__dirname, 'views/admin')
]);
app.set('view engine', 'ejs');

app.use(express.static('public'));
app.use('/public/admin/images', express.static('public/admin/images'));

app.use(express.urlencoded({ extended: true }));
app.use(express.json());

app.use(session(sessionConfig.createSessionConfig(mongoDbSessionStore)));

app.use(authMiddleware);

app.use('/', adminRoutes);
app.use('/', authRoutes);

app.use('/', defaultRoutes);
app.use('/', postsRoutes);
app.use('/', quotationsRoutes);
app.use('/', contactsRoutes);

app.use(function (req, res) {
  res.status(404).render('404');
});

app.use(function (error, req, res, next) {
  console.error(error);
  res.status(500).render('500');
});

if (typeof(PhusionPassenger) !== 'undefined') {
    PhusionPassenger.configure({ autoInstall: false });
}

if (typeof(PhusionPassenger) !== 'undefined') {
    db.connectToDatabase()
    .then(function () {
      app.listen('passenger');
    })
    .catch(function (error) {
      console.log('La connexion à la base de données a échoué !');
    });
} else {
    db.connectToDatabase()
    .then(function () {
      app.listen(port);
    })
    .catch(function (error) {
      console.log('La connexion à la base de données a échoué !');
    });
}

确实,我更改了MongoDB数据库与Passenger连接的代码逻辑,如下:

if (typeof(PhusionPassenger) !== 'undefined') {
        PhusionPassenger.configure({ autoInstall: false });
    }
    
    if (typeof(PhusionPassenger) !== 'undefined') {
        db.connectToDatabase()
        .then(function () {
          app.listen('passenger');
        })
        .catch(function (error) {
          console.log('La connexion à la base de données a échoué !');
        });
    } else {
        db.connectToDatabase()
        .then(function () {
          app.listen(port);
        })
        .catch(function (error) {
          console.log('La connexion à la base de données a échoué !');
        });
    }

编辑:这是访问博客时出现在日志中的错误:

应用程序 814821 output:节点:内部/进程/承诺:279 应用程序 814821 output:triggerUncaughtException(错误,真/* fromPromise /); App 814821 output:^ App 814821 output:[UnhandledPromiseRejection:此错误源于在没有 catch 块的异步 function 内部抛出,或者拒绝未使用 .catch() 处理的 promise。 promise 被拒绝,原因是“#”。] { App 814821 output: code: 'ERR_UNHANDLED_REJECTION' App 814821 output: } [ W 2022-11-19 10:30:01.7998 8136Cpp/CppInternal/T :96 ]: [Client 5-1] Sending 502 response: application did not send a complete response [ N 2022-11-19 10:30:01.8095 813657/Ti age/Cor/CoreMain.cpp:1147 ]: 检查是否断开进程 814821、应用程序/home/raso1970/node-com4muz(开发)App 815207 output 的长时间运行连接:节点:内部/进程/承诺:279 App 815207 output:triggerUncaughtException(err,true / fromPromise */); App 815207 output:^ App 815207 output:[UnhandledPromiseRejection:此错误源于在没有 catch 块的异步 function 内部抛出,或拒绝未使用 .catch() 处理的 promise。 promise 被拒绝,原因是“#”。] { App 815207 output: code: 'ERR_UNHANDLED_REJECTION' App 815207 output: } [ W 2022-11-19 10:30:03.7100 813.7100 813.7100.7100/TicppCortil/TicppCortil/TicppCortil :96 ]: [客户端 6-1] 发送 502 响应:应用程序未发送完整响应 [ W 2022-11-19 10:30:05.0596 813657/T3 age/Cor/App/Poo/AnalyticsCollection.cpp:102 ] : 进程 (pid=815207, group=/home/raso1970/node-com4muz (development)) 不再存在。 将其从池中分离:[ N 2022-11-19 10:30.05.0597 813657/T3 age/Cor/CoreMain:cpp:1147 ],检查是否断开进程 815207 的长时间运行连接,应用程序 /home/raso1970/ node-com4muz(开发)

应用程序似乎返回了一个错误,因此服务器没有响应发送,它被错误中断了。 我没有详细说明导致错误的原因,但它可能与 MondoDB 有关。 如果连接正确完成,应该在代码中检查。

实际上,错误只是说有一个 promise 或异步 function 遇到错误并且没有添加捕获处理程序。 由于我在尝试连接到我的数据库时返回的 promise 上调用了 catch,所以这个错误不太可能是从哪里来的。 我的应用程序的完整代码包含很多其他异步代码,所以我不能说问题出在哪里,但我认为数据库是一个转移注意力的问题。

我解决了这个问题。

基本上,我的 Node.js/Express 应用程序根本没有连接到我的 MongoDB Atlas 数据库

所以,我不得不更改app.js中与数据库连接相关的代码逻辑,如下所示:

if (typeof(PhusionPassenger) !== 'undefined') {
    PhusionPassenger.configure({ autoInstall: false });
    db.connectToDatabase()
      .then(function () {
          app.listen('passenger');
      })
      .catch(function (error) {
          console.log('La connexion à la base de données a échoué !');
      });
} else {
    db.connectToDatabase()
      .then(function () {
          app.listen(port);
      })
      .catch(function (error) {
          console.log('La connexion à la base de données a échoué !');
      });
}

但是,此更改还不够,因为我必须以不同方式为我的 web 应用程序设置MONGODB_URL环境变量。

基本上,我必须将MONGODB_URL设置为我的数据库的正确连接字符串。 除此之外,我为环境变量选择了一个名称以将端口传递给我的应用程序,然后将其设置为我想要的端口号。

事实上,当我读取端口时,我想要的是带有端口值的环境变量的名称,而不是带有 mongo db url 的名称。但是,在此更改之前,我是从process.env.MONGODB_URL读取端口的,它是我用来提供 mongo db url 的环境变量。

  1. 因此,第一个更改是通过编辑我网站的.htaccess文件来完成的:

因此,有两个这样做:

  • 一种方法是在您的 apache 配置中设置以下配置行(在您站点的虚拟主机块内):

SetEnv MONGODB_URL the_correct_value_goes_here

  • 另一种方法是从您的用户的 shell 导出它,假设 bash shell,这将是 go 在服务器主目录的 .bashrc 文件中,如下所示:

导出 MONGODB_URL="the_correct_value_goes_here"

  1. 然后,我在app.js中修改了MONGODB_URL环境变量名,如下:

我用MONGODB_URL类的东西替换了APP_PORT_NUMBER

所以,我替换了这段代码:

if (process.env.MONGODB_URL) {
  port = process.env.MONGODB_URL;
}

通过这个:

if (process.env.APP_PORT_NUMBER) {
  port = process.APP_PORT_NUMBER;
}

编辑: export不是 Apache 配置选项,你不能把它放在.htaccess文件中。 但是,您可以将.htaccess SetEnv

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM