修改羽毛hook.result中的响应状态代码

时间:2017-03-21 08:38:50

标签: javascript node.js express feathersjs

我最近一直在玩feathers.js,我喜欢它。我有以下问题,但......

在为update (http put)服务器方法放置的前钩子中,我根据某些条件决定是create还是update。如果我选择create,我会使用hook.result

跳过服务方法
let createLocation = (hook) => {
  return hook.app.service('locations').create({
    "user": hook.data.user,
    "location": [{
      "latitude": hook.data.location[0].latitude,
      "longitude": hook.data.location[0].longitude
    }]
  }).then(location => {
     hook.result = location;
     //************ change the response status code here?? **************\\
  });
};

但我无法更改响应状态代码以坚持201 created。帮助将不胜感激。 (另请指出在可能的情况下处理此问题的源代码,我进行了搜索,但没有成功)。

1 个答案:

答案 0 :(得分:2)

服务和挂钩是独立于传输的,这就是为什么它们可以通过websockets和HTTP使用的原因。任何HTTP特定逻辑都应该存在于自己的中间件中。有两种选择。要设置您可以实施a custom formatter的所有服务的状态代码,仅针对特定服务register service specific middleware

如果无法从数据中扣除状态代码,则可以在数据对象上define a hidden property(在将其转换为JSON时不会显示,并且不会显示):

let createLocation = (hook) => {
  return hook.app.service('locations').create({
    "user": hook.data.user,
    "location": [{
      "latitude": hook.data.location[0].latitude,
      "longitude": hook.data.location[0].longitude
    }]
  }).then(location => {
    Object.defineProperty(location, '__status', {
      value: 201
    });
    hook.result = location;
  });
};

并在自定义格式化程序中使用它:

const app = feathers();

function restFormatter(req, res) {
  res.format({
    'application/json': function() {
      const data = res.data;

      res.status(data.__status || 200);
      res.json(data);
    }
  });
}

app.configure(rest(restFormatter));

还有其他选项,例如passing the response to params,或者返回一个包含额外元信息的包装器对象({ status, data })。