我最近一直在玩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
。帮助将不胜感激。 (另请指出在可能的情况下处理此问题的源代码,我进行了搜索,但没有成功)。
答案 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 }
)。