Feathersjs -> сервис поиска с динамическими фильтрами и выбором столбцов
Так что на самом деле это не вопрос, а скорее пост о том, как я решил эту конкретную ситуацию:
Желаемая ситуация
Я хотел иметь возможность выбрать данные в пером find
сервисный звонок. Однако я не хотел возвращать все столбцы, но разные в зависимости от ситуации, а также иметь связанные модели в результатах. Если этого было недостаточно, мне нужно было пройти критерии фильтра для использования во всем выборе. Кроме того, это не должно быть сделано на стороне клиента, ну как можно меньше, поэтому манипулирование не будет рискованным
Разработанное решение
Это решение, которое я придумал. Я использую vuex, чтобы сделать вызов API от клиента, а в бэкэнде я использую перо-пользовательские методы, чтобы иметь сервис с несколькими методами, чтобы я мог связать его для модуля, я вызываю эти сервисы helper.service
, Так было бы, например, terms
с методом getSectionTerms
для базового выбора для конкретного раздела сайта, getTerms
для администрации (возвращая все). Я не описал каждый шаг в глубину, но могу сделать это позже.
Шаг 1: Установите перо-пользовательские методы, как описано в исходной документации
Шаг 2: Создайте служебный файл. Мой такой.
module.exports = function () {
const app = this;
const helpers = {
create () {},
setup (app, path) {},
findTerms(oFilters) {
const oTerms = null;
return getData(
app,
oFilters,
['term_type'],
['term_description'],
['metadata_code'],
['metadata_code']
);
}
};
app.use('helper_terms', helpers);
};
function getData(app, oFilters, arrColTerms, arrColTranslations, arrColLanguage, arrColSection) {
return app.service('mtp_sys_app_terms').find({
query: {
is_active: oFilters.is_active,
$select: arrColTerms
},
sequelize: {
raw: false,
include: [
{
model: app.service('/mtp_trans_sys_app_terms').Model,
as: 'translations',
attributes: arrColTranslations,
include: [
{
model: app.service('/mtp_sys_app_metadata').Model,
as: 'language',
attributes: arrColLanguage,
where: {
metadata_type: 'app_language'
}
}
]
}, {
model: app.service('/mtp_sys_app_metadata').Model,
as: 'section',
attributes: arrColSection,
where: {
metadata_type: 'app_section'
}
}
]
}
});
};
Первая часть в файле делает сам сервис. create
а также setup
обязаны заставить это работать. Затем вы можете добавить любое количество методов, которые вам нужны. Поскольку я буду повторять этот тип выбора данных, но хочу использовать другие столбцы и фильтры, я создал функцию для вызова начального метода поиска службы featherjs. Это вторая часть. Он настроен таким образом, что вам не нужно переписывать много раз. Хорошо, здесь и там мне нужно добавить некоторые проверки и настройки со значениями по умолчанию на случай, если параметр не будет передан.
Шаг 3: Настройте службу, которая будет использоваться. Я сделал это в моем index.js
файл
...
app.configure(helper_terms);
app.configure(customMethods({
methods: {
helper_terms: [
'findTerms'
]
}
}));
...
В этом файле я добавлю больше параметров в массив helper_terms
Мы сделаем еще одну запись в файле шага 2.
Шаг 4: настроить клиента. В моем случае звонок через магазин vuex
const getters = {
getTerms () {
return oFilters => api.service('helper_terms')
.findTerms(
oFilters
);
}
};
Это передаст критерии фильтрации бэкэнду. Я все еще изменяю это с большим количеством опций, но пока это работает. Я передаю объект на сервер с любым количеством фильтров, таких как is_active: 0
или же language: 'en'
Шаг 5 Вызовите функцию vuex где-нибудь, чтобы получить данные
this.$store.getters.getTerms({
strLanguage: this.$store.state.sysLanguage,
is_active: 1
}).then(oTerms => {
this.oTerms = oTerms;
});