NodeJS - MySQL 服务器在一段时间后无法工作
Posted
技术标签:
【中文标题】NodeJS - MySQL 服务器在一段时间后无法工作【英文标题】:NodeJS - MySQL server not working after some time 【发布时间】:2022-01-07 12:56:42 【问题描述】:基本上,我的 Node.js 服务器与 mysql 一起工作。当我在本地主机上工作时,一切都很好。与我的本地数据库(我正在使用 XAMPPP)的连接非常好,并且没有任何中断。 当服务器由提供商托管时,问题就会出现。我雇用的那个使用 cPanel 并且在一段时间过去之前一切都很好,因为我收到了这个错误:
events.js:377
throw er; // Unhandled 'error' event
^
Error: read ECONNRESET
at TCP.onStreamRead (internal/stream_base_commons.js:209:20)
Emitted 'error' event on Connection instance at:
at Connection._handleProtocolError (/home/adminis6/Artesofa/node_modules/mysql/lib/Connection.js:423:8)
at Protocol.emit (events.js:400:28)
at Protocol._delegateError (/home/adminis6/Artesofa/node_modules/mysql/lib/protocol/Protocol.js:398:10)
at Protocol.handleNetworkError (/home/adminis6/Artesofa/node_modules/mysql/lib/protocol/Protocol.js:371:10)
at Connection._handleNetworkError (/home/adminis6/Artesofa/node_modules/mysql/lib/Connection.js:418:18)
at Socket.emit (events.js:400:28)
at emitErrorNT (internal/streams/destroy.js:106:8)
at emitErrorCloseNT (internal/streams/destroy.js:74:3)
at processTicksAndRejections (internal/process/task_queues.js:82:21)
errno: -104,
code: 'ECONNRESET',
syscall: 'read',
fatal: true
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! amor-muebles@1.0.0 start: `node app.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the amor-muebles@1.0.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! /home/adminis6/.npm/_logs/2021-11-30T19_15_37_322Z-debug.log
我一直在研究如何解决这个问题,我得到的唯一有用的答案基本上是说数据库连接正在超时,所以我所要做的就是每隔一段时间发出一个请求,希望它不会休息。所以我在我的 app.js 文件中写了如下代码:
const fetch = require("node-fetch");
setInterval(() =>
fetch('sample-endpoint');
, 30000);
虽然这似乎解决了我的问题,但它一遍又一遍地出现(请注意,服务器运行的时间确实更长)。
后来,有人教我 CRONS,所以我做了以下 CRON:
PATH=$PATH:$HOME/bin; export PATH; /usr/bin/pgrep "node" >/dev/null || (cd /home/adminis6/Artesofa/; pkill node; pkill npm; nohup npm start &)
它确实有效,因为它启动了服务器,但它立即崩溃(实际上是在服务器启动之后,即使在服务器成功连接到数据库之后),它会记录以下内容:
> amor-muebles@1.0.0 start /home/adminis6/Artesofa
> node app.js
Server running on port 3100
mysql connected
events.js:377
throw er; // Unhandled 'error' event
^
Error: read ECONNRESET
at TCP.onStreamRead (internal/stream_base_commons.js:209:20)
Emitted 'error' event on Connection instance at:
at Connection._handleProtocolError (/home/adminis6/Artesofa/node_modules/mysql/lib/Connection.js:423:8)
at Protocol.emit (events.js:400:28)
at Protocol._delegateError (/home/adminis6/Artesofa/node_modules/mysql/lib/protocol/Protocol.js:398:10)
at Protocol.handleNetworkError (/home/adminis6/Artesofa/node_modules/mysql/lib/protocol/Protocol.js:371:10)
at Connection._handleNetworkError (/home/adminis6/Artesofa/node_modules/mysql/lib/Connection.js:418:18)
at Socket.emit (events.js:400:28)
at emitErrorNT (internal/streams/destroy.js:106:8)
at emitErrorCloseNT (internal/streams/destroy.js:74:3)
at processTicksAndRejections (internal/process/task_queues.js:82:21)
errno: -104,
code: 'ECONNRESET',
syscall: 'read',
fatal: true
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! amor-muebles@1.0.0 start: `node app.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the amor-muebles@1.0.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! /home/adminis6/.npm/_logs/2021-11-30T20_14_02_182Z-debug.log
我不知道还能尝试什么,也没有太多时间,请帮忙!
如果你需要,这里是我的 app.js:
/* ----------- Server initialization ----------- */
//Here are all the modudule's require
const app = express();
// Connect to mySQL DB
const db = require('./db/connectDB');
// Set server to listen on specified port
app.listen(process.env.PORT || '4000', () =>
console.log(`Server running on port $process.env.PORT AAAAA`);
)
app.set('view engine', 'ejs');
app.use(express.static('public'));
app.set('views', [
path.join(__dirname, 'views/adminSite/')
]);
/* ----------- Middleware ----------- */
app.use(express.urlencoded( extended: true ));
app.use(helmet());
app.use(cookieParser());
app.use(morgan('tiny'));
/* ----------- Routes ----------- */
app.use('/api', apiRoutes);
setInterval(() =>
fetch('https://administracionartesofa.com/api/sucursales');
, 30000);
最后,这是我的 connectDB 文件:
const mysql = require('mysql');
const dotenv = require('dotenv').config();
const settings = process.env.ENV === 'dev' ? require('./devSettings.json') : require('./prodSettings.json');
let db;
const connectDatabase = () =>
if (!db)
db = mysql.createConnection(settings);
db.connect((err) =>
if (err)
console.log('Database error');
console.log(err);
connectDatabase();
else
console.log('mysql connected');
)
return db;
module.exports = connectDatabase();
【问题讨论】:
您必须配置连接池以匹配数据库提供商的时间和客户端数量。如果你不这样做,你的池会抛出错误;它应该能够自动恢复。 【参考方案1】:在你的 nodejs 程序中使用mysql connection pool。您的托管服务提供商廉价而讨厌的共享 MySql 服务器具有极短的空闲连接时间限制。如果您保持打开连接的时间过长,服务器会猛烈关闭它,因此您会得到 ECONNRESET。
为什么? Cybercreeps试图闯入互联网上的随机服务器以获得乐趣和利润。希望这会减慢他们的速度。
连接池可以在幕后处理这个问题
-
在应用启动时设置池,并
在需要时从池中获取一个连接,使用它,然后将其返回到池中。
或者,您可以跳过池并在使用完毕后关闭连接,然后在再次需要时打开一个新连接。这对于低容量的应用程序来说可以正常工作,但如果你的音量上升,它可能会导致一些低效的连接抖动。游泳池更好。
【讨论】:
以上是关于NodeJS - MySQL 服务器在一段时间后无法工作的主要内容,如果未能解决你的问题,请参考以下文章
java - 如何使用java在一段时间后自动将数据存储到mySql数据库? [复制]