【问题标题】:Handle server errors in SailsJS在 SailsJS 中处理服务器错误
【发布时间】:2015-02-08 18:05:54
【问题描述】:

我正在 SailsJS 中创建一个应用程序。当数据库相关查询中出现一些错误时,我收到错误,例如 typeError 或 500 错误。我正在使用 MongoDB。有什么方法可以在服务器端捕获此错误。

现在,这些错误正在使我的服务器崩溃。服务器停止。我必须再次重新启动服务器。

请帮我解决这个问题。 提前致谢。

【问题讨论】:

    标签: node.js mongodb error-handling sails.js node-webkit


    【解决方案1】:

    很可能 waterline 引发了异常,而您没有捕捉到它。这里有一些代码可以解决这个问题:

    controlleAction:function(req,res){
      var invalidParams = {};//whatever's causing the error
    
      Model
      .create(invalidParams)
      .exec(function(err,created){
        if(err) res.json(err);
        res.json(created);
      });
    }
    

    你也可以使用 promise 语法

    controlleAction:function(req,res){
      var invalidParams = {};//whatever's causing the error
    
      Model
      .create(invalidParams)
      .then(function(created){
        res.json(created);
      })
      .catch(function(err){
        res.json(err);
      });
    }
    

    如果您试图捕获整个应用程序中的每个全局错误, 在你的 app.js 中有这样一行:

    // Start server
    sails.lift(rc('sails'));
    

    用 try catch 块包围该行,如下所示:

    try{
      // Start server
      sails.lift(rc('sails'));
    }catch(e){
      console.dir(e);
    }
    

    【讨论】:

    • 我给出了相同的代码。这实际上是有效的。但我想知道是否有任何通用方法来处理从服务器抛出的所有错误。就像数据库中不存在模型或某些代码出错一样,服务器将停止运行。我能以某种方式捕捉那些抛出的错误吗?
    • 我试过这个。它正在工作。但是没有响应发送到前端。它显示加载。我可以在这里获取请求和响应对象吗?
    【解决方案2】:

    请注意:

    controlleAction:function(req,res){
      var invalidParams = {};//whatever's causing the error
    
      Model
      .create(invalidParams)
      .exec(function(err,created){
        // return res.json()
        if(err) return res.json(err);
        return res.json(created);
      });
    }
    // The difference is in the return
    if(err) return res.json(err);
    

    如果您有错误,没有返回,服务器将崩溃,因为它会尝试发送两个响应,一个带有错误,另一个带有创建的对象。

    【讨论】:

      【解决方案3】:

      如果您使用的是 Sails 0.10.x,您可以将错误传递给下一个处理程序:

      controlleAction:function(req,res, next){
       var invalidParams = {};//whatever's causing the error
      
       Model
        .create(invalidParams)
        .exec(function(err,created){
          if(err) return next(err);
          return res.json(created);
        });
      }
      

      然后处理"Custom Responses"中的错误

      【讨论】:

      • 如果我尝试这种方法,我应该在我所有的服务和控制器中使用它,对吗?我可以在 app,js 中获得一些方法,其中我只能提供一个处理程序。
      • 如果由于异步操作而在回调中出现错误,则应将其传递到某处进行处理(在本例中为“下一个”),并且如果由于“抛出”而出现“同步”错误它将被传递给“serverError”响应。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      相关资源
      最近更新 更多