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

问题描述 投票:0回答:7

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

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

loopbackjs strongloop
7个回答
25
投票

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

var error = new Error("New password and confirmation do not match");
error.status = 400;
return cb(error);

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

如果您希望仅更改 HTTP 响应状态而不使用错误,则可以使用 #danielrvt 或 #superkau 定义的两种方法之一。要获取对 #superkau 提到的请求对象的引用,在方法注册中,您可以定义一个将传递给远程方法的附加参数。请参阅 输入参数的 HTTP 映射


4
投票

假设您有一个 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
投票

使用

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
投票

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

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

参见http://expressjs.com/api.html


2
投票

在您的远程方法注册中:

YourModel.remoteMethod('yourMethod', {
    accepts: [
      {arg: 'res', type: 'object', http:{source: 'res'}}
    ],
    ...
    returns: {root: true, type: 'string'},
    http: {path: '/:id/data', verb: 'get'}
  });

1
投票

如果您只需要修改响应状态,只需执行:

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

0
投票

在 Loopback 4 中有一个

HttpErrors
类用于此目的。这里只是一些:

// Throw a 400 error
throw new HttpErrors.BadRequest("Invalid request");

// Throw a 403 error
throw new HttpErrors.Forbidden("You don't have permission to do this");

// Throw a 404 error
throw new HttpErrors.NotFound("The data was not found")

您还可以在控制器的构造函数中注入

Response
对象并显式调用它:

// As a constructor argument
@inject(RestBindings.Http.RESPONSE) private res: Response

// In your method
this.res.status(400).send("Invalid request");
© www.soinside.com 2019 - 2024. All rights reserved.