[英]NodeJS + Cpanel Error : Incomplete response received from application (Node js, Express, Mongoose)
[英]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 的环境变量。
.htaccess
文件来完成的:因此,有两个这样做:
SetEnv MONGODB_URL the_correct_value_goes_here
导出 MONGODB_URL="the_correct_value_goes_here"
我用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.