![](/img/trans.png)
[英]What is the best way to use async/await inside onAuthStateChanged() of Firebase?
[英]How do we use Async, and what is the best way in nodeJS
我正在嘗試將查詢傳遞到數據庫,然后將結果發送到客戶端,但是看起來請求是異步的,因為我的請求發生在發布請求返回值之后。
如何設置等待請求?
我的數據庫連接
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'my_password',
database: 'MEETME'
});
connection.connect(function(err) {
if (err) {
console.log("error while connecting to database");
console.log(err.code);
}
});
// function that query database <-------
function queryDatabase(userQuery) {
connection.query(userQuery, function(err, result) {
if (err) {
throw err;
}
console.log("before");
return result;
});
}
這是我的帖子請求
//POST
app.post('/signin', function(request, response) {
var query = queryDatabase("SELECT EMAIL FROM MEMBER WHERE ID_MEMBER = 3");
console.log(query);
console.log("after");
response.end(query, 200);
});
控制台中的結果是:
undefined
after
before
更改queryDatabase函數的實現以返回承諾。 可以等待任何返回諾言的函數。
function queryDatabase(userQuery){
return new Promise((resolve,reject) => {
connection.query(userQuery, function(err, result){
if(err){
reject(err);
}
console.log("before");
resolve(result);
});
});
}
app.post('/signin', async function(request, response){
var query = await queryDatabase("SELECT EMAIL FROM MEMBER WHERE ID_MEMBER = 3");
console.log(query);
console.log("after");
response.end(query, 200);
});
歡迎使用Node.js,這里的所有內容都是異步的,除非您以將一個事件級聯到另一個事件的方式顯式構造代碼,否則代碼部分沒有義務以任何特定順序運行。
如果您不熟悉此概念,我強烈建議您選擇Promises作為組織代碼的一種方式。 這將許多棘手的程序包裝成一些整潔的方法,並使鏈接,扇出和扇入實際上非常簡單。
例如,用Sequelize重寫,該數據庫層使用promises:
function queryDatabase(userQuery){
console.log("before");
return connection.query(userQuery);
}
您退還諾言,該諾言已被鏈接起來。 如果不這樣做,則必須接受回調參數並將其鏈接在一起。 返回值在很大程度上被忽略:
function queryDatabase(userQuery, cb){
connection.query(userQuery, function(err, result){
cb(err, result);
});
console.log("before");
}
您可以看到已經有更多的廢紙if,如果需要在此基礎上增加更多的廢紙cru。 在回調驅動的代碼中插入可選步驟很棘手 。
承諾使您的代碼最終看起來像這樣:
app.post('/signin', function(request, response){
queryDatabase("SELECT EMAIL FROM MEMBER WHERE ID_MEMBER = 3")
.then(function(results) {
console.log(results);
console.log("after");
response.end(query, 200);
});
});
在一處修補錯誤並用catch
來處理錯誤也很簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.