MySql 命令可以从终端工作,但不能从节点 js 工作

Posted

技术标签:

【中文标题】MySql 命令可以从终端工作,但不能从节点 js 工作【英文标题】:MySql command is work from terminal but is not working from node js 【发布时间】:2018-01-08 11:02:42 【问题描述】:

我的 nodejs 网站有一个奇怪的问题。我有一个执行 SQL 命令的函数。它运行良好,但在运行服务器几天后。它开始返回一个空数组!!!当我重新启动服务器时,它再次恢复工作,但几天后仍然崩溃。

这是错误(空数组错误):

TypeError: Cannot read property '0' of undefined
    at Query._callback (/home/mikro/www/my_modules/database.js:47:27)
    at Query.Sequence.end (/home/mikro/www/node_modules/mysql/lib/protocol/sequences/Sequence.js:86:24)
    at /home/mikro/www/node_modules/mysql/lib/protocol/Protocol.js:226:14
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickDomainCallback (internal/process/next_tick.js:128:9)

这就是函数:

login: function (username, password, callback)  
        db.query('SELECT id, password, expdate FROM users WHERE username=' +
            mysql.escape(username) + ';', function (err, rows) 
            var row = rows[0];
            if (err) console.error(err)
            if (!row)
                callback(ERR_USER_NOT_FOUND, null);
            else
            bcrypt.compare(password, row.password, function (err, result) 
                if (result)
                    var expdate = row.expdate;
                    var currDate = moment(new Date()).format('YYYY-MM-DD HH:mm:ss');
                    if (moment(currDate).isAfter(expdate) && row.id !== 1)
                        callback ('Please pay your monthly fee to be able to login', null);
                    else
                        callback(null, row)
                
                else 
                    callback(ERR_WRONG_PASSWORD, null);
                
            )
        );
    

我有 Ubuntu 服务器并使用 nginx 代理运行 pm2。 我的依赖:

"dependencies": 
    "bcrypt-nodejs": "latest",
    "body-parser": "~1.16.0",
    "connect-flash": "^0.1.1",
    "cookie-parser": "~1.4.3",
    "debug": "~2.6.0",
    "ejs": "~2.5.5",
    "express": "~4.14.1",
    "express-session": "^1.15.1",
    "moment": "^2.18.1",
    "morgan": "~1.7.0",
    "mysql": "latest",
    "serve-favicon": "~2.3.2",
    "socket.io": "latest",
    "jwt-simple": "latest",
    "jsonfile": "latest",
    "express-mysql-session": "latest",
    "express-rate-limit": "latest"
  

更新1

这是连接代码:

var mysql  = require('mysql');
var db     = mysql.createConnection(require('./config'));
db.connect();

【问题讨论】:

用户名是字符串吗?如果是这样,它应该用引号括起来。如果这不是问题,您介意发布成功的查询吗? 显示你的mysql连接代码。 @RobbieToyota 是的,它是一个字符串,这不是问题,因为它之前工作过,并且在重新启动服务器后再次工作。但是问题出现了很多次,每次我重置服务器时都解决了。但是我不能每次出现问题时都重置服务器! @GandalftheWhite 我现在已经添加了 【参考方案1】:

首先你必须处理潜在的错误,如果 err 为空,你可以使用返回的结果。返回的结果也可能为空

if (err) callback(/*undefined_error*/, null);
if (!rows || rows.length == 0) callback(ERR_USER_NOT_FOUND, null);
var row = rows[0];
............

【讨论】:

是的,这很好,但为什么代码在完全停止之前工作了很多次?并且数据库值没有改变。为什么重启服务器后该功能再次起作用?? 当有人尝试使用不存在的用户名登录时服务器崩溃。您的代码在 mysql 数据库中查找输入的用户名,返回结果为空,下一步您的代码尝试执行此操作var row = rows[0],但 rows 数组为空,因为在数据库中未找到该用户名。【参考方案2】:

如果我理解正确,可能是由于网络超时或连接空闲超时导致 MySQl 连接重置的问题。

最好检查一下MySql连接代码的错误。

例如MySql 连接问题之一记录在: nodejs mysql Error: Connection lost The server closed the connection

【讨论】:

这是个好主意。但如果是连接问题,不应该有描述问题的错误吗?除了上面的错误,我没有找到任何东西。 您好,我已经重新安装了服务器并清除了所有日志。首先,我尝试登录并成功。但我知道问题仍然存在。我每小时检查一次错误日志文件并收到此错误:错误:连接丢失:服务器关闭了连接。 (/home/ammar/node_modules/mysql/lib/protocol/Protocol.js:113:13) 所以真的是连接问题。非常感谢你

以上是关于MySql 命令可以从终端工作,但不能从节点 js 工作的主要内容,如果未能解决你的问题,请参考以下文章

Sqoop Import 命令抛出错误,但它正在从终端工作

在终端中使用 mysql 来抑制警告消息,但密码是用 bash 脚本编写的

我可以从 mysql 命令行运行 IF 语句吗? v 5.6

如何从我的 Mac 上的终端窗口运行 g++

mysql SET FOREIGN_KEY_CHECKS=0 不能从命令行或 shell 脚本工作

MySQL 工作台中的交互式命令行