簡體   English   中英

我們如何使用異步,以及nodeJS的最佳方法是什么

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM