部署到共享主机时mysql2抛出lru-cache语法错误求解决
解决Hostinger共享主机上Node.js连接MySQL的两个问题(语法错误/连接断开)
一、解决SyntaxError: Unexpected token ;错误
问题原因
你使用的lru-cache@10.1.0和mysql2@3.0.0都要求Node.js 16及以上版本,但Hostinger共享主机默认的Node版本大概率低于16,旧版本Node无法解析这些依赖里的ES6+语法(比如报错行的单独heap;语句),导致编译失败。
解决方案
方案1:降级依赖到兼容低Node版本的版本
修改package.json里的对应依赖:
"lru-cache": "^7.18.3", "mysql2": "^2.3.3"
然后在SSH终端执行:
rm -rf node_modules package-lock.json npm install
方案2:升级服务器的Node.js版本
Hostinger支持通过nvm切换Node版本,SSH里执行以下命令:
# 安装Node.js 16版本 nvm install 16 # 切换到16版本 nvm use 16 # 设置为默认版本(下次登录自动使用) nvm alias default 16
完成后重新安装依赖并运行项目即可。
二、解决MySQL连接自动断开的问题
问题原因
旧版mysql@2.18.1存在兼容性问题,且默认配置没有重连机制,加上Hostinger共享主机的网络环境可能存在超时限制,导致连接频繁断开。
解决方案
推荐方案:改用降级后的mysql2并配置连接池
mysql2的稳定性比旧版mysql更好,配合连接池和重连配置可以有效解决断开问题:
const mysql = require('mysql2/promise'); // 创建连接池 const pool = mysql.createPool({ host: '你的数据库远程地址', user: '数据库用户名', password: '数据库密码', database: '目标数据库名', waitForConnections: true, connectionLimit: 10, queueLimit: 0, // 开启长连接保活 enableKeepAlive: true, keepAliveInitialDelay: 0, // 延长超时时间适配共享主机环境 connectTimeout: 60000, acquireTimeout: 60000, timeout: 60000 }); // 使用示例:执行查询 async function query(sql, params) { const [rows] = await pool.execute(sql, params); return rows; }
备选方案:给旧版mysql添加重连逻辑
如果坚持使用mysql@2.18.1,可以手动实现重连机制:
const mysql = require('mysql'); let connection; function handleDisconnect() { connection = mysql.createConnection({ host: '你的数据库远程地址', user: '数据库用户名', password: '数据库密码', database: '目标数据库名' }); connection.connect(err => { if (err) { console.log('连接失败,10秒后重试:', err); setTimeout(handleDisconnect, 10000); } }); connection.on('error', err => { console.log('数据库连接异常,触发重连:', err); if (err.code === 'PROTOCOL_CONNECTION_LOST') { handleDisconnect(); } else { throw err; } }); } // 初始化连接 handleDisconnect();
额外检查项
- 在Hostinger数据库面板中,确保已将服务器IP或
%(允许所有IP)添加到远程访问白名单; - 确认Hostinger防火墙没有拦截MySQL的3306端口。
内容的提问来源于stack exchange,提问作者Anant Gupta
相关产品推荐
相关产品推荐

