Return giá trị từ mysql trả về trong mysql module ???



  • Tình hình là em code dư lày:

    var selectSQL = function(accountItems) {
        var temp;
        con.query('call sp_compareAccount(?)', accountItems.email, function(err, result) {
            if (err) throw err;
            console.log(result[0][0]._email);
            temp = result[0][0]._email;
        });
        return temp;
    }
    

    Tình hình là console.log thì nó ra nhưng cứ return thì không đc ?



  • @Đức-Duy-Nguyễn Tôi nghĩ là do vấn đề bất đồng bộ (asynchronous). Bạn tìm đọc mấy bài về vấn đề này trong forum nhé.



  • Do biến temp được trả về trước khi truy vấn cơ sở dữ liệu (database query) được thực thi. Để kiểm tra thứ tự thực thi, bạn có thể làm như sau:

    var selectSQL = function(accountItems) {
        var temp;
        con.query('call sp_compareAccount(?)', accountItems.email, function(err, result) {
            if (err) throw err;
            console.log(result[0][0]._email);
            temp = result[0][0]._email;
            console.log(2);
        });
        console.log(1);
        return temp;
    }
    selectSQL(accountItems);
    

    Bạn sẽ thấy 1 được in ra màn hình trước 2. Nguyên nhân là do truy vấn cơ sở dữ liệu của bạn được thực thi không đồng bộ (asynchronously executed). Cụ thể hơn, ở thời điểm giá trị 1 được in ra màn hình, truy vấn này thay vì được thực thi, lại được xếp hàng chờ đợi đến lượt thực thi. Việc áp dụng thực thi không đồng bộ nhằm mục đích tránh cản trở (non-blocking) thực thi các đoạn code khác trong quá trình chờ đợi kết quả của truy vấn cơ sở dữ diệu. Đây cũng là lý do vì sao Nodejs lại có khả năng xử lý đồng thời (handling concurrency) các vấn tin Vào/Ra (I/O requests) cực kỳ tốt.

    Để truy xuất giá trị temp từ đoạn code trên, bạn cần phải chờ đến khi truy vấn cơ sở dữ liệu được thực thi xong qua việc sử dụng callback.

    var selectSQL = function(accountItems,callback) {
        con.query('call sp_compareAccount(?)', accountItems.email, function(err, result) {
            if (err) throw err;
            callback(result[0][0]._email);
        });
    }
    selectSQL(accountItems,function(temp){
        console.log(temp);
    });
    

    Tuy nhiên, bạn cần lưu ý, sử dụng callback không phải là giải pháp tốt nhất đối với lập trình không đồng bộ (asynchronous programming).



  • @tresdin Rất cảm ơn bác em mới nhập môn JS và node nên còn chưa nắm rõ hết :D. Học bằng cách lao vào làm exam thì nhanh hơn là cứ cày bình bình nên vấp đến đâu học đến đó.



  • Mình bổ sung và sửa chút ít bài của @tresdin nhé.

    • Khi sử dụng callback hãy luôn tuân thủ callback error first.
    • Trong callback không được dùng throw vì nó không throw ra đâu ( callback tước đoạt của chúng ta throw và return)
    var selectSQL = function(accountItems,callback) {
      con.query('call sp_compareAccount(?)', accountItems.email, function(err, result) {
        if (err)  {
          callback(err)
        } else {
          callback(null, result[0][0]._email);
        }
      });
    }
    selectSQL(accountItems,function(err, temp){
        console.log(temp);
    });
    

    Hiện nay thì bạn nên sử dụng Promise ( chậm hơn callback ) nhưng logic rất rõ ràng



  • nodejs gọi được procedure mysql được à
    hay nhỉ
    p/s :chưa biết gì cả,mới cài xong nodejs vào thấy bài này hay hay


Log in to reply