【问题标题】:How do I return specific http status codes from a remote method in loopback?如何从环回中的远程方法返回特定的 http 状态代码?
【发布时间】:2014-12-22 19:32:23
【问题描述】:

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

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

【问题讨论】:

标签: loopbackjs strongloop


【解决方案1】:

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

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

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

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

【讨论】:

  • 这不会返回整个堆栈跟踪吗?如果您想返回{ status: 404, message: 'Not found'},有没有更好的方法?
【解决方案2】:

当使用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

    【讨论】:

    • 我明白;但是如何获得快速响应的实例?
    • 取决于您处于生命周期的哪个部分。在某些地方,您可以访问 ctx,在这种情况下您可以使用ctx.req。围绕getCurrentContext也有大讨论:github.com/strongloop/loopback/issues/1676.
    • 为什么它被否决了?它可以工作而且它没有被弃用 api,expressjs.com/en/api.html#res.status
    • 如何获取 res 的引用?
    【解决方案4】:

    在你的远程方法注册中:

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

    【讨论】:

      【解决方案5】:

      假设您有一个 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' }
          }
        );
      

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-12
          • 1970-01-01
          • 2012-02-11
          • 2016-09-16
          • 1970-01-01
          • 2017-07-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多