我想知道是否有办法从远程方法中返回特定的 HTTP 状态代码。
我可以看到有一个回调函数,我们可以传递一个错误对象,但是我们如何定义HTTP状态代码?
如果您希望使用 HTTP 状态代码来通知错误,您可以在远程方法回调方法中传递错误:
var error = new Error("New password and confirmation do not match");
error.status = 400;
return cb(error);
您可以在此处找到有关错误对象的更多信息:错误对象
如果您希望仅更改 HTTP 响应状态而不使用错误,则可以使用 #danielrvt 或 #superkau 定义的两种方法之一。要获取对 #superkau 提到的请求对象的引用,在方法注册中,您可以定义一个将传递给远程方法的附加参数。请参阅 输入参数的 HTTP 映射
假设您有一个 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' }
}
);
使用
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 状态代码。
您可以像在 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'}
});
如果您只需要修改响应状态,只需执行:
ctx.res.status(400);
return cb(null);
在 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");