所以这不是一个真正的问题,更多的是关于我如何解决这种特定情况的帖子:
期望的情况
我希望能够从 feathersjsfind
服务调用中选择数据。但是,我不想返回所有列,而是根据情况返回不同的列,并且在结果中也有关联的模型。如果这还不够,我需要传递要在整个选择中使用的过滤条件。此外,它不是在客户端完成,并且尽可能少,因此操作不会有风险
开发的解决方案
这是我想出的解决方案。我正在使用 vuex 从客户端进行 api 调用,在后端我使用 feathers-custom-methods 来提供一个包含多种方法的服务,因此我可以将它捆绑在每个模块中,我称之为这些 services helper.service
。因此,例如terms
使用一种方法getSectionTerms
为特定站点部分进行基本选择,getTerms
用于管理(返回所有内容)。我没有详细描述每一步,但以后可能会这样做。
第 1 步:按照初始文档中的说明安装 feathers-custom-methods
第 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 的文件中创建另一个条目。
第四步:配置客户端。在我的情况下,通过 vuex 商店调用
const getters = {
getTerms () {
return oFilters => api.service('helper_terms')
.findTerms(
oFilters
);
}
};
这会将过滤条件传递给后端。我仍然用更多选项来改变它,但它现在正在工作。我将一个对象传递给后端,其中包含任意数量的过滤器,例如is_active: 0
或language: 'en'
Step 5在某处调用vuex函数获取数据
this.$store.getters.getTerms({
strLanguage: this.$store.state.sysLanguage,
is_active: 1
}).then(oTerms => {
this.oTerms = oTerms;
});