mysql
  • node.js
  • 2016-03-14 56 views 0 likes 
    0

    我對nodejs非常陌生,並且在理解如何使用mysql連接對象時遇到了一些困難。nodejs中的同步mysql查詢

    我的問題不在代碼中,而是在設計模式中。

    可以說我有用戶模塊

    module.exports = function(){ 
        return{ 
         id: "", 
         load: function(id){ 
          var sql = 'SELECT * from users where id = '+ DB.escape(id); 
          console.log(1); 
          DB.query(sql, function (err, rows) { 
           this.id = rows[0].id; // not working 
           console.log(rows[0].id); // prints the id 4 
           console.log(2); 
          }); 
          console.log(3); 
         } 
        } 
    } 
    

    從模塊外部我運行下一個代碼

    var user = require('../modules/user'); 
    var selected_user = user(); 
    console.log("entering users me route"); 
    selected_user.load(4); 
    console.log("user id is " + selected_user.id); //This does not print the id 4 
    

    當我運行該代碼,控制檯日誌1,則3,然後2. 這是由於節點js的異步流。

    但是,如果我建立一個網站,我需要查詢結束爲了填充我的用戶對象,然後再將HTML發送到瀏覽器?

    什麼是正確的做法?

    另外,當我嘗試填充用戶的id屬性,我從數據庫中收到的ID它不起作用。

    任何想法?

    謝謝

    回答

    2

    有幾種方法可以做到這一點。我會去Promises

    假設您有一個異步函數「getUsers」。 它看起來像這樣:

    function getUsers() { 
        longQuery(function(err, result){ 
         // What to do with result? 
        }); 
    

    你需要重寫它能夠使用的結果。 讓我們嘗試:

    function getUsers() { 
        return new Promise(function(resolve, reject) { 
         longQuery(function(err, result){ 
         if(err) reject(err) 
         else resolve(result) 
         }); 
        }); 
    

    現在這個函數返回一個承諾。我們對這個承諾做了什麼?

    function handleRequest(req, res) { 
        getUsers().then(function(result) { 
         // Do stuff with result 
         res.send(myProcessedData); 
        }).catch(function(err) {console.log(err)}; 
    } 
    

    這也可能已經完成與回調,傳遞響應對象作爲參數傳遞給查詢功能,以及許多其他的方式,但我認爲承諾是爲處理這是一個非常優雅的方式。

    +0

    但是,如果我有一個網頁,需要從數據庫中查詢很多,我希望它能像php說的那樣工作。運行查詢,獲取結果,做點什麼,繼續前進 –

    +0

    由於node.js非阻塞性質,這目前是不可能的。但是,鏈接承諾會產生非常類似的流程。 – matanso

    +0

    這正是我所做的,但它似乎很奇怪,因爲如果我有20個電話的數據庫,我需要改變20個「承諾」一個在另一個裏面,這似乎是一個非常糟糕的方式來建立一個網站 –

    0
    this.id = rows[0].id; // not working 
    

    上述行不起作用,因爲您在回調函數中將其設置爲this.id。當您處於回調函數this中時,並不意味着主對象中的this

    有關此更多的討論:見How to access the correct `this` context inside a callback?

    爲了解決異步JavaScript的性質,你可以使用類似的承諾從matanso答案,或者你可以傳遞一個回調函數,以您的加載方法。因此,您的load: function(id)方法將爲load: function(id, callbackFunction),並在獲取所需的所有數據時調用回調函數。

    相關問題