2014-03-06 45 views
5

我剛開始使用Sails.js,它是一個了不起的框架。但是我遇到了一些情況,我找不到Google的解決方案,所以我來這裏尋求幫助。Sails.js中的錯誤處理

我有一個控制器連接到另一個遠程服務,其設計很老,充滿了XML響應和不一致的API,將該服務包裝在簡單和乾淨的API中。所以,我有一些路由器,如:

list: function(req, res) { 
    params = { 
     ... 
    } 

    FooService.request(data, function(error, response) { 
     res.send(response) 
    }) 

    process.once('uncaughtException', function(err) { 
     res.send(500, '[Foo] ' + err); 
    }); 
}, 

的「process.once」是可以在FooService.request過程中提出的異步異常。我知道這是不好的代碼,我的問題是:如何處理更多的Sails.js方式?

在Node.js中我們有Domainconnect-domain,它們是針對這些問題而設計的。因爲Sails.js基本上是Express,它可以很好地促進連接域,所以我認爲可能有一些慣用的方法來做到這一點。

我試過在配置/ local.js添加此:

module.exports = { 
    ... 
    express: { 
     customMiddleware: function(app) { 
      console.log('Custom middleware config called') 

      var domain = require('connect-domain') 
      app.use(domain()) 
      .use(function(err, req, res, next) { 
       console.log('Error catched!') 
       res.send(500, '[Foo] ' + err) 
      }) 
     } 
    } 
}; 

非逮住異常發生時,它不會崩潰的服務器和錯誤500返回給客戶端('app.use(域())的作品)。但是自定義錯誤處理程序不會調用。不知道爲什麼。

+0

Sails有一個config文件夾,其中包含express.js文件,嘗試將連接域代碼放在那裏。 –

+0

是的我已經把它們放入express.js,但自定義處理程序.use(函數(err,req,res,next){})仍然沒有被調用... – Neo

回答

3

如果您在控制FooService代碼,那麼最好的選擇是通過在出錯時提前調用FooService.request的回調,然後在控制器中使用res.serverError或其他響應來處理髮生在那裏的所有錯誤:

FooService.request(data, function(error, response) { 
    if (error) {return res.serverError(errror);} 
    res.send(response) 
}); 

如果FooService接口的使用,你不控制包,這可能會投身的,他們沒有趕上異步代碼中的錯誤(錯誤代碼!)然後另一個很好的選擇是使用節點的error domains。請參閱this answer以獲取有關執行快速封裝以使用域來捕獲異步代碼中的錯誤的示例。

+1

既然v0.10.0(我認爲是這樣?) ,你可以使用'res.negotiate(error)'而不是每次扔500。 –