2017-08-01 67 views
0

我在我的nodejs網站有一個奇怪的問題。我有一個執行SQL命令的函數。它完美的工作,但運行幾天後的服務器。它開始返回一個空陣列!當我重新啓動服務器時,它會重新開始工作,但幾天後仍會崩潰。MySql命令是從終端工作,但不工作從節點js

這是錯誤(空數組錯誤):

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); 
       } 
      }) 
     }); 
    } 

我有nginx的代理服務器的Ubuntu和運行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" 
    } 

UPDATE1

這是連接代碼:

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

用戶名是否意味着字符串?如果是這樣,它應該用引號括起來。如果這不是問題,您是否介意發佈可以成功運行的查詢? – RToyo

+0

顯示你的mysql連接代碼。 –

+0

@RobbieToyota是的,它是一個字符串,這不是問題,因爲它重新啓動服務器之前工作和再次工作。但是問題出現很多時間,每次我重置服務器時都會解決問題。但是,我不能每次出現問題時重置服務器! –

回答

1

,這可能是MySQL連接復位的問題,由於網絡超時,或連接空閒超時。

更好地檢查MySql連接代碼處的錯誤。

例如登錄的MySql連接問題之一: nodejs mysql Error: Connection lost The server closed the connection

+0

這是個好主意。但是,如果這是一個連接問題不應該有一個錯誤,描述問題??除了上面的錯誤,我沒有找到任何東西。 –

+0

您好,我已重新安裝服務器並清除所有日誌。首先,我嘗試登錄並取得成功。但我知道問題仍然存在。我每隔一小時檢查一次錯誤日誌文件,並得到以下錯誤:錯誤:連接丟失:服務器關閉連接。 (/home/ammar/node_modules/mysql/lib/protocol/Protocol.js:113:13) 所以這真的是一個連接問題。非常感謝你 –

3

首先,你必須處理潛在的錯誤,如果犯錯爲空,你可以使用返回結果。另外,如果我理解正確的問題,返回的結果可能是空的

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

是的,這很好,但爲什麼代碼在完全停止之前多次運行?數據庫值沒有改變。以及爲什麼重新啓動服務器後,該功能再次工作? –

+1

當有人試圖用不存在的用戶名登錄時,服務器崩潰。你的代碼在mysql數據庫中查找輸入的用戶名,返回的結果是空的,下一步你的代碼嘗試執行這個'var row = rows [0]',但是rows數組是空的,因爲用戶名沒有在數據庫。 – Goolishka

相關問題