next()承诺错误处理

时间:2015-05-17 17:08:43

标签: node.js express mongoose promise bluebird

错误处理的最佳方法是什么? 我需要自定义json错误消息。这是一个API。

exports.putCurso = function (req, res, next) {
    util.updateDocument(req.curso, Curso, req.body);
    req.curso.saveAsync()
        .then(function (data) {
            return res.status(201).json({message: 'Curso atualizado.', data: data});
        })
        .catch(function(error) {
            return res.status(500).json({message: 'ERROR!'});
            //OR return next(error); but I need custom json error messages so it doesn't make sense
        })
        .finally(next); //OR return next(error)? redundant?
};

3 个答案:

答案 0 :(得分:1)

考虑Curso mongoose文件 你可以这样做

    req.curso.save(function(err,data){
      if(err) res.status(500).json({message: 'ERROR!'});
      else res.status(201).json({message: 'Curso atualizado.', data: data})
    });
编辑:如果你的小型节点应用程序中存在很多类似问题,那么值得关注rb,那么就可以像

一样
var RB = require('rb');
exports.putCurso = function (req, res, next) {
    util.updateDocument(req.curso, Curso, req.body);
    // the below line could have been written in some middleware (eg middleware provided by express.io), so we do get clear code in controller part.
    res.RB = RB.build(res, {  // you may customize your builder yours way, after looking into `rb` docs
      errorStatus : 500, successStatus : 201,
      errorKey : false, successKey : 'data',
      preProcessError : function(){ return { message : 'ERROR!' } },
      addToSuccess : { message : 'Curso atualizado.' }
    });

   //Now only one line in controller
   req.curso.save(res.RB.all);
};

披露:我是rb的作者。

答案 1 :(得分:1)

asCallback接受一个回调,它使用映射到回调约定的promise结果调用:

如果承诺被拒绝,它会将错误作为第一个参数调用回调:cb(error)

如果履行了承诺,它会使用值作为第二个参数调用回调:cb(null, value)

exports.putCurso = function (req, res, next) {
    util.updateDocument(req.curso, Curso, req.body);
    req.curso.saveAsync()
        .then(function (data) {
            return res.status(201).json({message: 'Curso atualizado.', data: data});
        })
        .catch(function(error) {
            return res.status(500).json({message: 'ERROR!'});
            //OR return next(error); but I need custom json error messages so it doesn't make sense
        })
        .asCallback(next);
};

答案 2 :(得分:1)

我不是猫鼬,但我知道关于表达和承诺的一两件事

exports.putCurso = function (req, res, next) {
  util.updateDocument(req.curso, Curso, req.body);
  req.curso.saveAsync()
      .then(function (data) {
        res.status(201).json({message: 'Curso atualizado.', data: data});
      }, function(error){
        res.status(500).json({message: 'ERROR!'});
      })
};

这基本上就是你需要的一切。根据实现,这可能是一个正常的路由,因为它总是向客户端返回一些东西(res.json)。因此,您不必调用next,因为它适用于中间件调用

此外,你不必返回任何东西,因为当你调用res.json时,它基本上说这个请求在这里结束,没有别的。

最后但并非最不重要的是,根据规范,promise then支持2个函数,第一个用于处理成功案例,第二个用于例外。因此,您无需致电catch