【问题标题】:NodeJS Mysql module throws ETIMEDOUT error on remote DBNodeJS Mysql 模块在远程数据库上抛出 ETIMEDOUT 错误
【发布时间】:2019-01-26 05:47:26
【问题描述】:

美好的一天!

我正在尝试使用 Node JS 连接到 MySQL 数据库。我 npm id mysql 并将其包含在我的文件顶部。当我运行我的代码时,我什么也得不到。我确实控制台在脚本末尾记录了连接,这给了我一个有效的连接模型作为回报。我似乎从来没有达到 .connect 中的功能,也没有查询或 ping。

当我连接到 localhost(运行 Wamp 服务器)时,连接成功并且我检索了一些控制台日志。我尝试连接到第二个外部数据库,但出现了同样的错误。

我收到的错误:

ETIMEDOUT。在 Connection_handleConnectTimeout。握手时protocol.js中的错误是致命的。 (我省略了一些文字)。

我安装了最新的 mysql 模块。

   var mysql = require('mysql');
    var connection = mysql.createConnection({
        host: 'MY_HOST_IP',
        database: 'MY_HOST_DB',
        user: 'MY_HOST_USR',
        password: 'MY_PW'
    });
    connection.connect(function (err) {
        console.log('conecting');
        if (err) {
            console.error('Error connecting: ' + err.stack);
        }

        console.log('Connected as id ' + connection.threadId);
    });
    connection.query('SELECT * from accounts', function (error, results, fields) {
        if (error) console.log(error);
        console.log('account ', results[0]);
    });
    connection.ping(function (error) { console.log('pingerror'); });

编辑:

上述代码在连接到两个外部托管数据库之一(使用它们的 IP 地址)时超时。这些数据库的主人说设置没有问题。 我尝试从 127.0.0.1:22005 连接到数据库,也许有问题? 当我将上面的代码放在一个独立的 JS 文件中并在我的命令行中使用 node 运行它时,它会连接。

【问题讨论】:

  • 用 ip 代替 localhost 试试。
  • 喜欢 127.0.0.1 而不是 localhost?
  • 是的,或者机器的网络IP。两个都试试
  • 这很奇怪。如果我将 127.0.0.1 作为主机,它也会超时......我需要设置一些标志吗?编辑:如果我把 127.0.0.1 作为 localAddress 它工作。当我将我的外部数据库主机 (IP) 作为 localAddress 时,我显然让用户不允许访问本地主机。那我应该把什么作为主持人呢。
  • 现在在手机上将在明天发布解决方案。

标签: mysql node.js


【解决方案1】:

您需要授予所有/特定IP的所有权限,如下所示:

// 下面的查询创建没有密码的用户,设置不同的密码检查这个:http://knowmysql.blogspot.com/2013/09/mysql-grant-password-error-error-1372.html

CREATE USER 'root'@'%' IDENTIFIED VIA mysql_native_password USING '';

//添加权限

将所有权限授予 . 到 'root'@'%';

【讨论】:

  • 感谢您的回复。我使用的用户正好是 'USR'@'%'。
【解决方案2】:

默认情况下,Node MySQL 模块将连接到端口 3306。如果您想连接到自定义端口(例如 22005),您需要通过将 port: 22005 添加到您传递给 mysql.createConnection 的对象来指定它()。您还应该确保 MY_HOST_IP 上的端口可以从您在网络级别上运行 Node 实例的主机访问。

【讨论】:

  • 感谢您的回复。mysql 服务器侦听端口 3306。它只是我用来连接使用 22005 的 mysql DB 的服务器(仅用于它自己)。这以前工作得很好。我什至可以从终端连接,只是不使用此服务器。所以主机是可达的。
  • Node 是否在 Linux 上运行,如果是,您在该主机上是否有 root 权限?如果是,sudo strace -p $(pidof node | tr ' ' ',') -f -e network 然后做一些事情让服务器尝试连接。这将显示它正在尝试连接到哪个主机以及在哪个端口上。
猜你喜欢
  • 2021-09-14
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2012-04-02
相关资源
最近更新 更多