Изменение кода статуса ответа в перьях hook.result
Я играл с пером в последнее время, и мне это нравится. У меня есть следующая проблема, но...
В перед крюком для 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 ответ
Сервисы и хуки независимы от транспорта, поэтому их можно использовать как через веб-сокеты, так и через 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 }
), которая имеет дополнительную мета-информацию.