2016-09-07 13 views
0

編輯:我正在改寫我的問題:Socket.io不等待回調和連接永遠不會被接受。請參閱下面的編輯2 /嘗試1Socket.io和Node.js與MySQL不返回結果,因爲經濟

這是針對數據庫檢查身份驗證令牌。有人可以發現這裏有什麼問題嗎?

var checkauth = function(auth) { 
    var rs = 0; 
    var sql = 'SELECT * FROM clients WHERE pword=\''+auth+'\''; 
    // Copied from debug session and got results: SELECT * FROM clients WHERE pword='d98e623c7a74a178703d17e1fd536b1488724acd41e71f178331c768c385bda2c82d2bcb60cbb4650be375ad4734c63fb694bd164c138f9abe0c51f37f9a7e33' 
    var query = connection.query(sql); 
    query 
     .on('error', function(err) { 
      console.log(err); 
     }) 
     .on('result', function(row) { 
      rs = Number(row.client_id); // This never fires!!?!?! 
     }) 
     .on('end',function(){ 

     }); 
    if (rs == 0) { 
     sql = 'SELECT * FROM users WHERE pword=\''+auth+'\''; 
     query = connection.query(sql); 
     query 
      .on('error', function(err) { 
       console.log(err); 
      }) 
      .on('result', function(row) { 
       rs = Number(row.client_id); // This never fires!!?!?! 
      }) 
      .on('end',function(){ 
      }); 
    } 
    return rs; 
} 

編輯1:我用的是follwoing循環來驗證它運行的功能socket.io連接好了,所以我知道我必須等待數據庫來完成,在那裏我會放回調?

io.use(function(socket, next){ 
    console.log("Query: ", socket.handshake.query); 
    // return the result of next() to accept the connection. 
    socket.clientid = 0; 
    socket.clientid = checkauth(socket.handshake.query.auth); 
    console.log("CID:"+socket.clientid); 
    if (socket.clientid != 0) { 
     return next(); 
    } 
    // call next() with an Error if you need to reject the connection. 
    next(new Error('Authentication error')); 
}); 

EDIT 2/1嘗試根據約翰建議:

var checkauth = function(auth, cb) { 
    var rs = 0; 
    var sql = 'SELECT * FROM clients WHERE pword=?'; 
    var query = connection.query(sql, [auth]); 
    query 
     .on('error', function(err) { 
      console.log(err); 
     }) 
     .on('result', function(row) { 
      rs = Number(row.client_id); 
     }) 
     .on('end', function() { 
      if (rs == 0) { 
       sql = 'SELECT * FROM users WHERE pword=?'; 
       query = connection.query(sql, [auth]); 
       query 
        .on('error', function(err) { 
         console.log(err); 
        }) 
        .on('result', function(row) { 
         rs = Number(row.client_id); 
        }) 
        .on('end', function() { 
         cb(rs); 
        }); 
      } 
     }); 
} 

io.use(function(socket, next){ 
    console.log("Query: ", socket.handshake.query); 
    // return the result of next() to accept the connection. 
    socket.clientid = 0; 
    var auth = socket.handshake.query.auth; 

    checkauth(auth, function(clientid){ 
     socket.clientid = clientid; 
     if (clientid != 0) { 
      return next(); 
     } 
     console.log('CLIENID', clientid); 
     next(new Error('Authentication error')); 
    }); 

    // if (socket.clientid != 0) { 
    //  return next(); 
    // } 
    // // call next() with an Error if you need to reject the connection. 
    // next(new Error('Authentication error')); 
}); 
+0

你得到記錄了任何錯誤? –

+0

什麼都沒有,沒有錯誤,調試器只是通過查詢,不打錯誤,結果或結束 – johan

+0

返回rs應該在回調裏,否則它會一直返回rs == 0 – shikhar

回答

0

這整個過程是異步。你必須做兩件事:

把所有事情都移到事件回調中,並且 添加一個回調或承諾給你的checkAuth函數。你也應該逃避你插入的數據。

EDITED SOLUTION

var checkauth = function(auth, cb) { 
    var rs = 0; 
    var sql = 'SELECT * FROM clients WHERE pword=?'; 
    var query = connection.query(sql, [auth], (err, client) => { 
     if(err || !client || client.length < 1) return cb(err || new Error('unkown client')); 
     sql = 'SELECT * FROM users WHERE pword=?'; 
     query = connection.query(sql, [auth], (err, user) => { 
      if(err || !user || user.length < 1) return cb(err || new Error('unkown user')); 
      cb(null, client[0].client_id); 
     }); 
    }); 
} 

注意:你爲什麼要在第一時間做2個查詢和用戶的每個客戶端存儲的密碼?

原來的答案:

var checkauth = function(auth, cb) { 
    var rs = 0; 
    var sql = 'SELECT * FROM clients WHERE pword=?'; 
    var query = connection.query(sql, [auth]); 
    query 
     .on('error', function(err) { 
      console.log(err); 
     }) 
     .on('result', function(row) { 
      rs = Number(row.client_id); // This never fires!!?!?! 
     }) 
     .on('end', function() { 
      if (rs == 0) { 
       sql = 'SELECT * FROM users WHERE pword=?'; 
       query = connection.query(sql, [auth]); 
       query 
        .on('error', function(err) { 
         console.log(err); 
        }) 
        .on('result', function(row) { 
         rs = Number(row.client_id); // This never fires!!?!?! 
        }) 
        .on('end', function() { 
         cb(rs); 
        }); 
      } 
     }); 
} 

checkauth(123, function(clientId){ 
    console.log('CLIENID', clientId); 
}); 
+0

嗨Johannes,感謝您的建議,但我相信這是與io.use不用等待checkauth完成,請參閱我的編輯/ atempt1 – johan

+0

感謝Johannes,這導致我回答,我發現的回調必須在第一個rs賦值之後,以及在查詢結果部分的第二個rs賦值之後。 – johan

+0

@johan這是不可能的,因爲cb會被這樣調用兩次。你可以簡化這整個事情。 –