如何从环回中的远程方法返回特定的http状态代码?

时间:2014-12-22 19:32:24

标签: loopbackjs strongloop

我想知道是否有办法从远程方法中返回特定的HTTP状态代码。

我可以看到有一个回调函数,我们可以传递一个错误对象,但是我们如何定义HTTP状态代码呢?

5 个答案:

答案 0 :(得分:20)

如果您希望使用HTTP状态代码来通知错误,可以在远程方法回调方法中传递错误:



$window.location.href = "/your/path/here";




您可以在此处找到有关错误对象的更多信息:Error object

如果您希望在不使用错误的情况下更改HTTP响应状态,可以使用#danielrvt或#superkhau定义的两种方法之一。要获取#superkhau提到的请求对象的引用,在方法注册中,您可以定义一个将传递给远程方法的附加参数。见HTTP mapping of input arguments

答案 1 :(得分:1)

如果您只需要修改响应状态,请执行以下操作:

ctx.res.status(400);
return cb(null);

答案 2 :(得分:1)

使用async远程方法函数时,需要让async函数抛出任何遇到的错误,而不是试图捕获它们并调用return。通过调用return,您告诉LoopBack它应该像成功一样进行响应。

这是一个示例工作结构。

AdminDashboard.login = async(body) => {
  let username = body.username
  let password = body.password
  await isDomainAdmin(username, password)
}
AdminDashboard.remoteMethod(
  'login',
  {
    http: {path: '/login', verb: 'put'},
    consumes: ['application/json'],
    produces: ['application/json'],
    accepts: [
      {arg: 'body', type: 'Credentials', http: {source: 'body'}}
    ]
  }
)

只要确保您调用的任何内部函数(如isDomainAdmin)也直接抛出错误,或者捕获它们并将其转换为错误对象,如下所示:

{
  statusCode: 401,
  message: 'Unauthorized'
}

err.statusCode是您要LoopBack返回的HTTP状态代码。

答案 3 :(得分:0)

让我们假设您拥有一个CoffeShop模型,并且如果该商品不在您的数据库中,则希望发送状态404。

CoffeeShop.getName = function(req, res, cb) {
    var shopId = req.query.id;
    CoffeeShop.findById(shopId, function(err, instance) {
      if (instance && instance.name){
        var response = instance.name;
        cb(null, response);
      }
      else {
        res.status(404);
        cb(null);
      }
    });
  }

CoffeeShop.remoteMethod(
    'getName',
    {
      http: { path: '/getname', verb: 'get' },
      accepts: [{arg: 'req', type: 'object', http: { source: 'req' }},
                { arg: 'res', type: 'object', http: { source: 'res' }}],
      returns: { arg: 'name', type: 'string' }
    }
  );

答案 4 :(得分:-1)

您可以像在ExpressJS中一样返回任何状态代码。

...
res.status(400).send('Bad Request');
...

请参阅http://expressjs.com/api.html