如何在Strongloop Loopback中更改HTTP状态码

6
我正在尝试修改创建操作的HTTP状态码。
POST /api/users
{
    "lastname": "wqe",
    "firstname": "qwe",
}

返回200而不是201
对于错误,我可以这样做:
var err = new Error();
err.statusCode = 406;
return callback(err, info);

但是我找不到如何更改创建的状态码。

我找到了创建方法:

MySQL.prototype.create = function (model, data, callback) {
  var fields = this.toFields(model, data);
  var sql = 'INSERT INTO ' + this.tableEscaped(model);
  if (fields) {
    sql += ' SET ' + fields;
  } else {
    sql += ' VALUES ()';
  }
  this.query(sql, function (err, info) {
    callback(err, info && info.insertId);
  });
};

我也一直在努力弄清楚这个问题。更全面的文档会更好 :( - Jake
3个回答

10

在调用remoteMethod时,你可以直接向响应中添加一个函数,这可以通过使用rest.after选项来实现:

function responseStatus(status) {
  return function(context, callback) {
    var result = context.result;
    if(testResult(result)) { // testResult is some method for checking that you have the correct return data
      context.res.statusCode = status;
    }
    return callback();
  }
}

MyModel.remoteMethod('create', {
  description: 'Create a new object and persist it into the data source',
  accepts: {arg: 'data', type: 'object', description: 'Model instance data', http: {source: 'body'}},
  returns: {arg: 'data', type: mname, root: true},
  http: {verb: 'post', path: '/'},
  rest: {after: responseStatus(201) }
});

注意:似乎strongloop会在context.result值为falsey时强制返回204“无内容”状态码。为了解决这个问题,我只需传回一个空对象{}并附上所需的状态码即可。

3

在http参数中,您可以为远程方法指定一个默认的成功响应代码。

MyModel.remoteMethod(
  'create',
  {
    http: {path: '/', verb: 'post', status: 201},
    ...
  }
);

0

对于Loopback版本2和3+:您还可以使用afterRemote钩子来修改响应:

module.exports = function(MyModel) {  
  MyModel.afterRemote('create', function(
    context,
    remoteMethodOutput,
    next
  ) {
    context.res.statusCode = 201;
    next();
  });
};

通过这种方式,您无需修改或触及原始方法或其签名。您还可以通过此挂钩自定义输出以及状态代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接