我最近一直在玩羽毛.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
。帮助将不胜感激。(如果可能的话,也请指出处理此问题的源代码,我确实搜索但没有成功(。
服务和钩子与传输无关,这就是为什么它们可以通过websockets和HTTP使用的原因。任何特定于HTTP的逻辑都应该存在于自己的中间件中。有两种选择。要为所有服务设置状态代码,您可以实现自定义格式化程序,对于特定服务,您可以注册特定于服务的中间件。
如果无法从数据中扣除状态代码,则可以在数据对象上定义一个隐藏属性(不可写,在将其转换为 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));
还有其他选项,例如将响应传递给参数或返回具有附加元信息的包装对象({ status, data }
(。