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

Loopbackjs 如何在环回中从远程方法返回特定的http状态码?,loopbackjs,strongloop,Loopbackjs,Strongloop,我想知道是否有一种方法可以从远程方法中返回特定的HTTP状态代码 我可以看到有一个回调函数,我们可以传递一个错误对象,但是我们如何定义HTTP状态代码?您可以像在ExpressJS中一样返回任何状态代码 ... res.status(400).send('Bad Request'); ... 请参见远程方法注册中的: YourModel.remoteMethod('yourMethod', { accepts: [ {arg: 'res', type: 'object',

我想知道是否有一种方法可以从远程方法中返回特定的HTTP状态代码


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

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

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

请参见远程方法注册中的

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

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

var error=新错误(“新密码和确认不匹配”);
error.status=400;

返回cb(错误)如果您只需要修改响应状态,只需执行以下操作:

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

假设您有一个咖啡店模型,如果商品不在数据库中,您希望发送状态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' }
    }
  );

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

下面是一个示例工作结构

AdminDashboard.login = async(body) => {
  let username = body.username
  let password = body.password
  await isDomainAdmin(username, password)
}
只需确保您调用的任何内部函数(如
isDomainAdmin
)也直接抛出错误,或者捕获错误并将其转换为错误对象,如下所示:

{
  statusCode: 401,
  message: 'Unauthorized'
}

其中,
err.statusCode
是希望环回返回的HTTP状态代码

你使用哪种技术?如果环回是我们正在谈论的,那么它的作者们的回答是:我理解这一点;但是如何获得express response的实例呢?取决于您处于生命周期的哪个部分。在某些地方,您可以访问ctx,在这种情况下,您可以执行
ctx.req
。也有关于getCurrentContext:的主要讨论。为什么被否决?它可以工作,而且不是不推荐使用的api,如何获取res的引用?这不返回整个堆栈跟踪吗?如果您想返回
{status:404,消息:'notfound'}
有更好的方法吗?
{
  statusCode: 401,
  message: 'Unauthorized'
}