2012-03-10 49 views
7

Tôi đang xây dựng một ứng dụng trong đó trên một cuộc gọi cụ thể, tôi phải chặn và chờ kết quả từ một truy vấn xác thực trước khi kết nối.nodeJS trả về giá trị từ gọi lại

function authenticate(userid, hash) 
{ 
    mysql_client.query("SELECT `hash` FROM `auth` WHERE `userid` = " + userid, function selectCb(err, results, fields) { 
    if (err) 
    { 
     client.send("Error communicating with mysql, please retry your request"); 
     return false; 
    } 

    if(results.length == 0 || results[0].hash != hash) 
    { 
     client.send("Error comparing authentication data with database, please retry request"); 
     return false; 
    } 

    return true; 
} 
); 
} 

Tôi muốn để có thể trả lại những giá trị từ authenticate() chức năng riêng của mình, không phải là nội anonymous function selectCb và có xác nhận khối cho đến khi gọi lại là hoàn tất. Làm thế nào tôi có thể đi về việc này?

Trả lời

13

Chức năng bên ngoài của bạn cần cung cấp một cuộc gọi lại có thể được thực thi sau khi cuộc gọi mysql được thực hiện. Một cái gì đó dọc theo dòng này:

function authenticate(user, pass, callback) { 
    mysql_client.query("...", function (err, results, fields) { 
     if (err) { 
      callback("Error communicating ..."); 
     } else if (results.length ...) { 
      callback("Error comparing authentication..."); 
     } 
     callback() 
    }); 
}); 

Ví dụ sử dụng:

authenticate('jim', '123456', function (err) { 
    if (err) { 
     alert(err); 
    } else { 
     alert('Welcome'); 
    } 
}); 
+0

Cảm ơn bạn, điều này dường như là một giải pháp thú vị, tuy nhiên tôi vẫn còn một chút không chắc chắn làm thế nào để có được một giá trị trong số này. Nói rằng tôi muốn yêu cầu dừng tại thời điểm này nếu xác thực không thành công, nếu không hãy tiếp tục với ứng dụng. Có vẻ như bất cứ điều gì tôi trở lại trong cuộc gọi lại đó cũng sẽ được ăn như giá trị trả về callbacks, vì vậy tôi không thể chỉ đơn giản là trả về true/false từ điều này là tốt. Tôi sẽ làm thế nào? –

+0

@majicbunnie nếu một phần của luồng ứng dụng của bạn là không đồng bộ, điều đó làm cho toàn bộ rất nhiều không đồng bộ và bạn cần phải có callbacks như thế này tất cả các cách thức thông qua. Để đơn giản hóa điều này và làm cho mã của bạn dễ dàng hơn để làm việc với, bạn nên xem xét một khái niệm được gọi là "tương lai" hoặc "lời hứa". Nó giúp bạn tiết kiệm từ việc tạo ra các callbacks lồng nhau điên cuồng. Có rất nhiều thông tin xung quanh nếu bạn tìm kiếm nó, nhưng bạn có thể bắt đầu ở đây: http://howtonode.org/promises – nickf

+0

Cùng với OP. Nếu không sử dụng Promises hoặc tương tự, làm sao người ta có thể trả về các giá trị đó từ chính hàm authenticate() bằng cách sử dụng một chương trình đơn giản? Tôi có thể hiểu được giải pháp, nhưng tôi đã bối rối bởi việc sử dụng ví dụ. Nó không giống như nó trả lời câu hỏi của OP. – jagc

Các vấn đề liên quan