2017-08-13 27 views
0

我正在學習Node.js的過程中,並堅持如何返回mysql查詢的結果作爲API響應。從我目前閱讀的內容來看,似乎我需要返回一個承諾並解決它,但我不確定如何返回數據。承諾:如何獲得迴應?

function get_free_count() { 
    return new Promise(function(resolve,reject) { 
     var sql = "SELECT COUNT(id) AS number FROM users"; 
     conn.query(sql, function(err,result) { 
      if(err) return reject(err); 
      console.log(result[0].number); 
      resolve(result[0].number); 
     }); 
    }); 
} 

app.get('/users/free/count', function(req,res) { 
    var output; 
    output = get_free_count().then(res.json(output)); 
}); 

我陷入瞭解決和返回響應點。如果我在then()函數中創建回調函數,我將無法訪問res對象,因爲它超出了範圍。到目前爲止,我一直無法找到如何返回數據庫值。有什麼方法可以將我的免費計數作爲API響應返回?

在此先感謝。

+0

不換行'並承諾自己conn.query',有[ (https://www.npmjs.com/package/promise-mysql) – Kos

+0

是的,你應該在'then'調用中創建一個回調函數,因爲'then'需要一個回調函數。不,res'不會超出範圍,因爲回調是*閉包*。嘗試一下! – Bergi

回答

0

您需要在then回調中定義output,也只有在承諾解決後才應該調用res.json。目前它立即被調用。

app.get('/users/free/count', (req, res) => { 
    get_free_count().then(output => res.json(output)); 
}); 
+0

感謝alexmac的快速響應 – calh27

0

如果我創建了當時()函數中的回調函數,我不會是能夠訪問,由於它是超出範圍的資源對象。

這就是你錯了 - 你能夠訪問res變量,因爲它仍然是在相同的範圍(我的意思在這裏是新的,內在的範圍,可以訪問所有的變量可用在舊的,外部的範圍內)。有沒有錯,下面的例子:

app.get('/users/free/count', function(req, res){ 
    // You don't actually need to store the "output" variable, 
    // as it serves no real purpose in your example 
    var output; 
    output = get_free_count().then(function (dbResult) { 
     // req, res, output and dbResult are all valid variables in this scope 
     // "dbResult" is equal to "result[0].number", 
     // the resolution value of "get_free_count()" call 
     res.json(dbResult); 
    }); 
}); 

這是如何在JavaScript中工作關閉,你可以閱讀更多關於他們at MDN "Closures"

+0

你是什麼原因在你的例子中留下'output'變量? – alexmac

+0

沒有理由離開它,但也沒有理由將其刪除(因爲OP可能以與示例中提供的方式不同的方式重用它)。我已經添加了關於該變量冗餘的評論。 – mdziekon

+1

我認爲OP意味着使用'output'這個名字來表示你所謂的'dbResult'。 – Bergi