1

所以这不是一个真正的问题,更多的是关于我如何解决这种特定情况的帖子:

期望的情况

我希望能够从 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: 0language: 'en'

Step 5在某处调用vuex函数获取数据

this.$store.getters.getTerms({
                strLanguage: this.$store.state.sysLanguage,
                is_active: 1
            }).then(oTerms => {
                this.oTerms = oTerms;
            });
4

0 回答 0