2017-06-09 28 views
0

我正在研究一個非常簡單的Web應用程序,它沒有做太多的工作,但是它在一個表上連接到數據庫以進行INSERT和SELECT操作。我有一個功能,我瀏覽了幾個偉大的教程時使用,但我無法返回從SELECT查詢rows。記住我正在學習Node.JS - 我將如何顯示從查詢(SELECT)返回到此塊的數據?函數的內部函數的返回值node.js/MySQL

app.post("/getcsv", function(req,res){ 

var sqlselall = "SELECT * FROM office"; 
var rows = handle_database(sqlselall); 
res.json(rows); 
res.end(); 

用於處理數據庫連接(使用池)的功能:

function handle_database(sqlstmt){ 

pool.getConnection(function(err,connection){ 

    if(err) { 
     res.json({"code" : 100, "status" : "Error in connection to database."}); 
     return; 
    } 

    console.log('connected as id ' + connection.threadId); 

    connection.query(sqlstmt, function(err,rows){ 
     connection.release(); 
     if(!err){ 
      console.log("Number of rows affected: " + rows.affectedRows); 
     } 

    }); 

    connection.on('error', function(err) { 
     res.json({"code": 100, "status" : "Error in connection to database."}); 
     return; 
    }); 

我意識到,在內部功能的rows包含了我所需要的數據,但我在茫然,當我調用函數時如何返回它。

+0

的可能的複製[如何返回從一個異步調用的響應?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-打電話) – Paul

+0

@保羅 - 不幸的是我很難完全掌握JS中回調的概念。 – Smitty

+0

這只是你必須通過一些教程來運行的東西。回調函數只是函數,但是你想要的肉(例如行)只在該函數的範圍內。所以你需要確保你所需要的一切都在相同的範圍內。 – Paul

回答

0

回答我自己的問題,尤其是考慮到一些人可能認爲它是重複的(這是由於我對Node.JS和JS一般的認識不足),似乎不合適,但是我發現一旦我做了一些研究(感謝@保羅 - 和回調地獄),並獲得關於函數,回調,匿名函數和Javascript中函數範圍性質的一些基礎知識的澄清,我能夠提出解決我的問題的方法。如果我能

app.post("/getcsv", function(req, res) { 

    var sqlselall = "SELECT * FROM office" 
    var thisData = select_query(sqlselall, res) 
}) 

function select_query(sqlstmt, res) { 

    pool.query(sqlstmt, function(err, results, fields) { 
    if (err) throw err 
    res.send(JSON.stringify(results)) 
    }) 
} 
1

所以:所以我連接到數據庫我創建了從app.post通過從回調參數參數「水庫」(我現在有所瞭解)一個新的簡化功能評論你回答我會。這是我想補充你的答案,因爲它看起來像你的答案應該適用於我,雖然我沒有親自測試過它。

從努力學習回調風格的經驗,我認爲這可能會幫助你。它確實有助於讓代碼更加模塊化。

app.post("/getcsv", function(req, res) { 
    var sqlselall = "SELECT * FROM office" 
    select_query(sqlselall, function(results){ 
     res.send(results) 
    }) 
}) 

function select_query(sqlstmt, callback) { 
    pool.query(sqlstmt, function(err, results, fields) { 
    //I suppose if this is how you want to handle errors 
    //for debugging purposes I like returning them as well 
    //returning it helps both you and others who might be working on 
    //the front end to know whats happening 
    if (err) throw err 
    callback(JSON.stringify(results)) 
    }) 
} 

這樣你select_query功能不需要資源,以獲得通過的,並且不依賴於,爲了工作,有一個函數的參數。有些時候不能得到幫助,但是當我可以發現維護更容易考慮時。

在假設的情況下,您可能有另一個需要查詢的端點,但需要在發送之前附加修改信息,您仍然可以使用select_query函數並修改回調函數你通過它。所以,你最終會是這樣的:(我也改變了錯誤處理略)

​​

就像我說的,我不是說你的方式是錯誤的,它的工作原理,也許它會工作更好您。我剛剛發現,這幫助我處理了回調,並且開始享受使用它們的樂趣。

+0

謝謝你!您的第一個代碼示例實際上有助於將回調主頁的概念稍微多一點。因此,您可以傳遞一個匿名函數作爲與您調用的指定函數內的回調函數相對應的參數。從邏輯的角度來看,並不是一個很容易理解的概念,尤其是來自C#。 – Smitty

+0

對,它就像一個不同的範例,但我真的很喜歡它。我很高興它有幫助。 – Jeff