2015-09-26 58 views
3

我有這種疑問,真的不是問題,但我想知道如果我的實際結構來處理請求和響應是非阻塞的。Expressjs路由請求和響應是異步?

我的一些代碼如下所示:

get: (req, res) -> 
    permission = req.user.username 

    if not permission 
     return res.json new Unauthorized("#{req.user.username} no tiene permisos") 

    Client.find() 
     .exec (err, clients) -> 
     if err then res.json new Internal(err.message, err.stack) 
     if not clients then res.json new NotFound('No encontrado') 

     res.json new Ok(clients, 'OK') 

,當然還有在路由器歸檔處理,但我不知道什麼時候我的代碼是異步,當它不是。

那麼,有人可以解釋我,如果這是一個異步非阻塞代碼?如果不是,請提供一些文檔或庫?我嘗試使用promise,但它在執行時會引發一些錯誤(我認爲這是因爲我很小巧)。

就是這樣,在此先感謝!

+1

您可以通過在get函數最底部的exec回調和console.log('找到'之前)添加console.log('found')來檢查Client.find是否被阻塞。 「發現之前」應先顯示,當數據庫結果回來時,你應該看到「發現」 – Molda

+0

是的! 「之前」的信息出現,好吧,哈哈之前。所以我可以說代碼是異步的,對嗎? – Nano

+0

它已被證明是我quess :) nodejs沒有等待數據庫的結果,並進行處理和聲音的異步給我。 – Molda

回答

2

Mongoose的exec()是代碼中的異步函數。根據經驗,昂貴的操作是異步的,而操作不是*。昂貴是指需要一些ms的操作,如讀取遠程文件,訪問(可能)遠程數據庫,甚至讀取本地文件。一些昂貴的異步操作示例:

  • request:加載外部網站。
  • fs:從您的系統讀取文件。大多數功能是異步的,但是由於讀取文件並不昂貴,所以它們也具有同步版本。
  • mongoose:正如@Molda解釋的那樣,您的貓鼬調用是異步的。大部分的貓鼬手術都是。

此外,異步函數的特點是它們打破了文件流,所以它們通常包含執行流程繼續的回調。在節點中,這些回調接受兩個或更多參數作爲約定,第一個參數是錯誤,其他參數是檢索數據。

request('httsp://google.com/', function(err, response, body){ 
    console.log(body); // print the website's html on the terminal 
}); 

fs.readFile('/config.js', function(err, message){ 
    console.log(message); // print the contents of config.js on the terminal 
}); 

User.find({ id: 25 }, function(err, user){ 
    console.log(user); // print user's 25 data on the terminal 
}); 

編輯:作爲替代,你可以通過一條線通過在find()回調,使得這個功能異步簡化代碼:對於以前的例子

Client.find {}, (err, clients) -> 
    if err then res.json new Internal(err.message, err.stack) 
    if not clients then res.json new NotFound('No encontrado') 

    res.json new Ok(clients, 'OK') 

*請注意:昂貴的便宜是高度相對的。例如,parsing a huge file in JSON can be really expensive和它們是同步的,而做小文件讀取則相對便宜。

+1

這是一個有用的信息!謝謝 – Nano

+0

不客氣,很高興提供幫助 –