2013-03-19 71 views
0

處理快速路由中自定義事件偵聽器的最佳方式是什麼?快速路線中的自定義事件偵聽器

我可能做的一切都是錯誤的,但這裏是我的時刻:

module.exports = { 
    get: function(req, res, next) { 

     MyModel.on('error', function(err) { 
      res.send(501) 
     }) 

     MyModel.on('found', function() { 
      res.send(200) 
     }) 

     MyModel.on('notFound', function() { 
      res.send(404) 
     }) 

     MyModel.findByName(req.params.name); 
     } 
} 

我可以看到這是完全錯誤的,因爲每個事件監聽器在每次請求加入。

開始傳遞響應對象以促進事件觸發時的響應也感覺不對。

我可以在findByName方法上使用回調函數,但我真的很喜歡綁定到事件系統,但我只是想知道如何更好地處理這種情況。

回答

1

不要使用事件綁定爲此,使用回調函數:

module.exports = { 
    get: function(req, res, next) { 
     MyModel.findByName(req.params.name, function (error, model) { 
      if (error) { 
       return res.status(501).send(error); 
      } 
      if (!model) { 
       return res.status(404).send('Not found'); 
      } 
      res.send(model.toJSON()); 
     }); 
     } 
} 

添加基於註釋一些澄清,你的例子是使用快遞和貓鼬,都是由同一原始作者和兩主要面向功能風格的編程和回調。儘管可以設計框架以使用事件,回調或兩者兼得(可選),但在這兩種特定情況下,庫迫使您使用回調,因爲它不提供這些特定操作的事件。這就是爲什麼對於這些​​特殊呼叫的快遞和貓鼬來說,回傳是一種習慣用語。

現在看一下你的例子,mongoose確實在Model類級別發出了一些事件,但是這些事件並沒有與明確的請求/響應關聯,因此更適合於錯誤日誌記錄和異常處理以及一些其他的特殊用例的基本Web應用程序響應呈現。

所以當我說「不要用戶事件綁定這個」,我並不是說事件綁定從來都不合適,只是給定你的特定代碼片段,它們不被你使用的庫支持也不是基本的make-a-db-query-and-send-back-a-web-page場景的這個例子的習慣用法。

+0

我原來是這樣的,但我試圖限制使用回調可能發生的嵌套量。我想在這種情況下,它會起作用,並在事情需要更深入時添加事件監聽器。 – Nick 2013-03-19 14:14:27

+0

2件事情:1,如果你沒有用回調下來,你正在使用錯誤的編程環境,期間。這就像試圖做lisp,除非你討厭括號。 2. Model類本身的事件偵聽器只會處理尚未由回調處理的事件,並且不會正確地構造程序以使您可以訪問所需的請求和響應對象。使用命名函數和流控制庫管理嵌套,但使用回調並烘焙到節點的核心中。 – 2013-03-19 14:22:09

+0

我完全沒有回調問題,但它是關於爲工作選擇正確的工具。事件監聽器也是節點的一個非常核心的部分(事實上,事件循環使得節點如此強大)。請更有建設性。 – Nick 2013-03-19 16:00:13

相關問題