You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派4运行JavaScript连接远程MySQL失败问题咨询

排查树莓派4上JavaScript连接远程MySQL失败的问题

一、确认树莓派与远程MySQL服务器的连接状态

直接用命令测试网络连通性,比盲目排查更高效:

  • 测试3306端口连通性:
    执行telnet aa.bbb.cc.ddd 3306,若能连接会弹出MySQL的欢迎信息;若提示「连接超时」或「拒绝连接」,说明要么树莓派本地防火墙拦截了3306端口出站请求,要么远程服务器的安全组/防火墙未给树莓派IP开放3306端口权限。
    嫌telnet操作麻烦的话,可改用nc -zv aa.bbb.cc.ddd 3306,成功会显示「succeeded!」,失败会直接给出具体报错原因。
  • 检查树莓派本地防火墙:
    输入sudo ufw status查看防火墙是否开启,若处于开启状态,确认是否允许3306端口出站,未配置的话执行sudo ufw allow out 3306添加规则。
  • 服务器端权限二次确认:
    虽然Python能正常连接,但仍可验证MySQL用户权限:登录远程MySQL服务器,执行SELECT user, host FROM mysql.user WHERE user='你的用户名';,查看host列是否包含树莓派IP或%(允许所有IP访问)。若没有,执行GRANT ALL ON 你的数据库.* TO '你的用户名'@'树莓派公网IP' IDENTIFIED BY '你的密码';,再执行FLUSH PRIVILEGES;刷新权限。

二、JavaScript脚本的排查要点

既然Python能正常连接,说明网络和凭据无问题,问题大概率出在JS代码或依赖环境上:

  1. 核对MySQL客户端版本:
    Arduino YUN上的JS MySQL模块版本可能与树莓派上的不一致,执行npm list mysql(若使用mysql2则替换为mysql2)查看当前版本。若版本差异较大,可降级或升级至与YUN上一致的版本,例如npm install mysql@x.x.x(x.x.x为YUN上的具体版本号)。
  2. 检查连接配置细节:
    • 逐行对比JS与Python的连接参数:主机IP、端口(默认3306,避免写错)、用户名、密码、数据库名,尤其注意Linux系统下MySQL的数据库名/表名区分大小写,而Arduino YUN的系统可能不区分,别因大小写问题导致找不到目标表。
    • 部分MySQL服务器强制要求SSL连接,Python可能自动适配,但JS客户端需显式配置。可在连接代码中添加ssl: true:
      const connection = mysql.createConnection({
        host: 'aa.bbb.cc.ddd',
        user: '你的用户名',
        password: '你的密码',
        database: '你的数据库',
        ssl: true
      });
      
  3. 补全错误捕获代码:
    当前脚本未捕获连接或查询错误,直接访问null[0]才抛出异常。给连接和查询逻辑添加错误处理,查看具体报错信息:
    connection.connect(function(err) {
      if (err) {
        console.error('连接失败详情:', err.stack);
        return;
      }
      console.log('连接成功,ID:', connection.threadId);
    });
    
    connection.query('你的SQL查询语句', function(err, results) {
      if (err) {
        console.error('查询错误:', err.message);
        return;
      }
      // 先判断结果是否存在再取值
      if (results && results.length > 0) {
        console.log(results[0]);
      } else {
        console.log('查询结果为空');
      }
    });
    
  4. 检查SQL语句兼容性:
    避免因字符串拼接导致语法错误,JS中推荐使用占位符?实现参数化查询,而非直接拼接字符串,示例:
    // 正确的参数化查询写法
    connection.query('SELECT * FROM 表名 WHERE id = ?', [你的ID值], function(err, results) {
      // 处理逻辑
    });
    
  5. 重装依赖解决版本冲突:
    即便安装了所有依赖,仍可能存在版本冲突问题。删除node_modules文件夹和package-lock.json文件,重新执行npm install,确保依赖环境干净无冲突。

内容的提问来源于stack exchange,提问作者Mainland

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 12:40:16