javascript - Node.js + setInterval = 连接丢失 : The server closed the connection

标签 javascript node.js

我有一个简单的 Node.JS 脚本(只是一个脚本,没有服务器),它应该每 24 小时执行一次操作。但大约 8 小时后,我在错误日志中看到了这一点:

Error: Connection lost: The server closed the connection.
    at Protocol.end (/home/user/dev/app/node_modules/mysql/lib/protocol/Protocol.js:73:13)
    at Socket.onend (stream.js:79:10)
    at Socket.EventEmitter.emit (events.js:117:20)
    at _stream_readable.js:910:16
    at process._tickCallback (node.js:415:13)
error: Forever detected script exited with code: 8
error: Forever restarting script for 1 time

我敢肯定这是愚蠢的,而且很容易修复,但我还找不到它。有什么想法吗?

最佳答案

看起来您正在与远程 MySQL 服务器保持打开的连接。远程服务器在空闲连接 8 小时后关闭连接。所以你有两个选择。您要么发送保活请求,要么在初始请求后断开连接,然后在计时器启动下一个事件时再次打开连接。

保持活跃

如果您想发送保活请求,只需在间隔计时器上设置一个select 1

select 1 只是一个简单的查询,它将导致 MySQL 返回 1 的结果并重置 MySQL 服务器的连接超时。它看起来像这样。

function keepalive() {
  connection.query('select 1', [], function(err, result) {
    if(err) return console.log(err);
    // Successul keepalive
  });
}
setInterval(keepalive, 1000*60*5);

池化

但是,您最好使用 mysql 模块的 pool functionality .它将根据需要连接到 MySQL 服务器,并自动为您处理断开连接。

关于javascript - Node.js + setInterval = 连接丢失 : The server closed the connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17942505/

相关文章:

javascript - 获取 POST 在 Edge v42+ 中不起作用

javascript - 如何在特定按钮上将 ng-disabled 设置为 false

node.js - 在 Node : is it possible for two callbacks to be executed exactly at the same time?

node.js - mongoose 不是和 nosql 矛盾吗?

javascript - 如何使用 deferrable 执行一系列 Redis 操作?

javascript - Nodejs 从字符串执行导出的函数

javascript - JQuery Mobile 中同一行的格式标签和切换开关

node.js - Express + Passport.js : req. 用户未定义

node.js - 显示正方形的图表 js

javascript - 获取相同的数据到两个选择元素