[已解决]相同的代码一台电脑可以连接MySQL,另一台不行?

@Ta 03-17 00:02 291点击

问题不是解决的,是它自己消失的.我做的步骤有点奇怪,我尽量都记录下来,防止下次出现类似问题:
1.我把相同的程序传到一台阿里云轻量服务器上
2.运行node index.js,然后调用接口依然出现相同错误
3.更改mysql配置为另外一台云mysql数据库,然后连接成功.
4.尝试把mysql配置信息改回去,它就自己好了.
5.我有点担心是我先前把连接信息填错了(而且两个数据库信息都填错了),于是尝试使用git reset --hard 回到以前的版本,但失败了;因为由于先前我怀疑是程序问题,把本地git库连代码一起删掉了,然后clone的远程库,由于远程库上忽略了配置文件,我查不到之前的配置信息;不过我更倾向于我没有填错信息


2019-03-16更新:
我发现我无法控制变量了,我是这样做的:
1.使用自己的电脑无法连接,但是使用公司的电脑可以连接,而服务器用的%(几乎可以判定mysql服务器配置没问题)
2.为了进一步判断是不是mysql服务器的问题,我使用了一个腾讯云的mysql数据库依然报错,无法连接。
3.虽然家里电脑的程序和公司电脑是通过git同步的,防止是程序的问题,我还使用php最简代码来连接依然出现相同的错误。
4.为了排除是网络问题,家用电脑使用了wifi和数据流量两种方式连接报错。
5.为了进一步排除是网络的问题,我使用的navicat软件进行连接,发现都可以连接。
6.为了排除是操作系统的问题,我使用了虚拟机创建了一个ubuntu来进行测试,结果依然出错。
7.我做过包括但是不限于重新给mysql用户授权、更改网络环境、更换数据库服务器、更换操作系统、关闭本地防火墙等等操作,结果依然是无法解决。

第一次遇见连出现原因都没搞清楚的问题!帖子先放在这里,如果哪一天我解决了这个问题,再更新


是js的代码,用的node中的mysql库,相同的代码,公司的电脑可以连接,家里的电脑就不行了。报错:

  1. {
  2.     "msg": {
  3.         "code": "ER_ACCESS_DENIED_ERROR",
  4.         "errno": 1045,
  5.         "sqlMessage": "Access denied for user 'Curtion'@'118.112.73.18' (using password: YES)",
  6.         "sqlState": "28000",
  7.         "fatal": true
  8.     },
  9.     "status": "-1"
  10. }

mysql的远程的,并没有做白名单,任何人都可以连接;使用过的方法:重启mysql,更改密码,重新创建账号,安装mysql库的其它版本 都没有效果,并且同一电脑的navicat可以连接。

代码如下:

  1. const mysql = require("mysql");//mysql操作库
  2. const config = require("./config");//配置文件
  3. const _db = Symbol("db");
  4. class Sql {
  5.     constructor() {
  6.         this[_db] = mysql.createPool({
  7.             host: config.mysql.host,
  8.             port: config.mysql.port,
  9.             user: config.mysql.user,
  10.             password: config.mysql.password,
  11.             database: config.mysql.database
  12.         });
  13.     }
  14.     query(sql, value) {
  15.         return new Promise((resove, reject) => {
  16.             this[_db].getConnection((err, connection) => {
  17.                 if(err){
  18.                     reject(err);
  19.                 }else{
  20.                     connection.query(sql, value, (err, rows)=>{
  21.                         if(err){
  22.                             reject(err);
  23.                         }else{
  24.                             resove(rows);
  25.                         }
  26.                     })
  27.                     connection.release();
  28.                 }
  29.             })
  30.         })
  31.     }
  32. }
  33. module.exports = Sql;

配置文件以下:(ip和密码隐了,信息绝对正确,因为相同的信息可以用navicat连接)

  1. module.exports = {
  2.     jstSecret: 'laohuhuiyouyong',//jwt密钥
  3.     tokenExpiresTime: 1000 * 60 * 60 * 24 * 7,//token过期时间
  4.     mysql:{
  5.         host: "no permission",//数据库地址
  6.         port: "3306",//端口
  7.         user: "Curtion",//用户名
  8.         password: "no permission",//密码
  9.         database: "node_blog"//数据库名
  10.     }
  11. }

完整的小demo地址:https://github.com/Curtion/meu-blog
谁有空给看看?

回复列表(14)
  • 1
    @Ta / 03-14 22:42
    @Curtion,不会代码 但我分析没准和dns劫持 或者被墙之类有关,或者js的解释器还有编译环境操作系统!因为你的代码如果两份一模一样的话肯定就不是代码的原因!
  • 2
    @Ta / 03-14 22:45
    @Curtion,tokenExpiresTime: 1000 * 60 * 60 * 24 * 7,//token过期时间 这个过期时间会不会比你的连接时间短?
  • 3
    @Ta / 03-14 22:47

    @此号以封,这个过期时间是jwt认证成功后设置的有效时间,mysql连接没有用到它

  • 4
    @Ta / 03-15 01:38

    @Curtion,mysql的用户是与来源IP绑定的。如果连接非本机的mysql,可以在mysql上创建一个来源IP为%(不限)的用户,给它授权数据库访问,然后重载权限。建议使用图形用户界面(比如phpmyadmin等)操作。

  • 5
    @Ta / 03-15 07:56

    @老虎会游泳,现在正是使用的%,并且使用相同的电脑用navicat这个软件是可以连接的

  • 6
    @Ta / 03-15 19:57

    @Curtion,你用户的密码套件是什么,是mysql_native_password还是caching_sha2_password?如果是caching_sha2_password(mysql8默认),不支持这个套件的就无法连接。

  • 7
    @Ta / 03-15 21:15

    @老虎会游泳,服务器是5.3版本的,没有那么高的版本。经过控制变量的测试,大概可能是本地网络的问题。现在实验过本地MySQL环境可以连接,使用腾讯云的云数据库也是相同的错误,使用navicat连接腾讯云mysql成功。我使用php同样无法连接(腾讯云和自建的都),相同的错误。本地网络有没有什么东西会影响的的?

  • 8
    @Ta / 03-15 21:26

    @Curtion,用WSL里面的mysql命令试试看,或者找一个mysql.exe

    mysql -h xxx:3306 -u Curtion -p -D node_blog

    MySQL的连接协议应该不会因为本地网络有NAT就发生问题啊。你是不是写错服务器IP地址了,而那个服务器上恰好有另一个mysql

  • 9
    @Ta / 03-15 23:32

    @老虎会游泳,你这个方法可以连接,但是需要改一点东西,我使用xxx:3306会报错,把端口单独加一个-P 3360参数就连接成功了

  • 10
    @Ta / 03-15 23:35
  • 11
    @Ta / 03-15 23:39

    @老虎会游泳,对了,我可能忽略了一个细节,这个电脑最开始是可以连接的,在某一天我下班回家后就无法连接了,在我记忆中我是没有更改代码和服务器配置的任何东西。

  • 12
    @Ta / 03-16 03:41

    @Curtion,真神奇。你运行netsh winsock reset重置一下网络协议栈吧

    还有,你试试用这个最简单的代码来连接:

    1. var mysql      = require('mysql');
    2. var connection = mysql.createConnection({
    3.   host     : 'localhost',
    4.   user     : 'root',
    5.   password : '123456',
    6.   database : 'test'
    7. });
    8.  
    9. connection.connect();
    10.  
    11. connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
    12.   if (error) throw error;
    13.   console.log('The solution is: ', results[0].solution);
    14. });

    port是3306应该不用写。

  • 13
    @Ta / 03-16 12:16

    @老虎会游泳,我去,同样的错误

  • 14
    @Ta / 03-16 13:36

    @Curtion,这我就不知道了

添加新回复
回复需要登录
[聊天-公共聊天室]TabKey9:阿里云用户创建的自定义镜像如何下载到本地…