首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在app.service服务扩展中使用FeathersJS (‘myService’)?

如何在app.service服务扩展中使用FeathersJS (‘myService’)?
EN

Stack Overflow用户
提问于 2019-12-16 17:26:10
回答 2查看 2.2K关注 0票数 2

我试图在我的find()应用程序中扩展一个名为properties的服务的FeathersJS方法。

我需要的是在find()返回的所有记录中附加一个数组,其中包含来自另一个名为propertyadds的服务的整数。这意味着我需要改变我的反应

代码语言:javascript
复制
{
  "total": 2973,
  "limit": 10,
  "skip": 0,
  "data": [
    {
      "id": 1,
      ...
    },
    {
      "id": 2,
      ...
    }
    ...
  ]
}

代码语言:javascript
复制
{
  "total": 2973,
  "limit": 10,
  "skip": 0,
  data: [
    {
      "id": 1,
      ...
      "additionals": [10,20,30]
    },
    {
      "id": 2,
      ...
      "additionals": [12,25,33]
    }
    ...
  ]
}

中的值来自service propertyadds,该服务管理一个表,如

代码语言:javascript
复制
| property_id | additional_id |
|-------------|---------------|
|      1      |       10      |
|      1      |       20      |
|      1      |       30      |
|      2      |       12      |
|      2      |       25      |
|      2      |       33      |
|-------------|---------------|

我最初的想法是像这样扩展properties服务

代码语言:javascript
复制
const { Service } = require('feathers-sequelize');

exports.Properties = class Properties extends Service {
  async find(data,params) {
      let newResponse = await super.find(data,params);
      let newData = newResponse.data.map(async pr => {
          pr.additionals = await app.service('propertyadds').find({
              properti_id: pr.id
          })
          return pr;
      })
      return {
          total: newResponse.total,
          limit: newResponse.limit,
          skip: newResponse.skip,
          data: newData
      }
  }
};

问题是我在src/services/properties/properties.class.js中没有src/services/properties/properties.class.js,而且(我是FeathersJS的新手)我不知道如何获得它。

我需要什么才能让一个有效的app访问这个模块中的所有服务?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-16 20:34:16

事实上,当我访问src/services/properties.service.js并发现这一行时,解决方案就实现了。

代码语言:javascript
复制
app.use('/properties', new Properties(options, app));

因此,服务properties实际上是在其创建过程中接收到一个app对象。

学习这一点使我看到了正确的解决方案,用src/services/properties/properties.class.js编写,如下所示:

代码语言:javascript
复制
const { Service } = require('feathers-sequelize');

exports.Properties = class Properties extends Service {

    constructor(options, app) {
        super(options, app);
        this.app = app;
    }

    async find(data, params) {
        let oldRes = await super.find(data, params);
        let newResData = oldRes.data.map(async pr => {
            let includedRecords = await this.app.service('propertyadds').find({
                query: {
                    property_id: pr.id
                }
            })
            pr.additionals = includedRecords.map(e => e.additional_id).sort();
            return pr;
        })
        return await Promise.all(newResData)
            .then(completed => {
                return {
                    total: oldRes.total,
                    limit: oldRes.limit,
                    skip: oldRes.skip,
                    data: completed
                }
            })
    }
}

可以看到,这是为extended类创建一个constructor方法的问题,以便在this.app中公开app对象。这可以在调用super(options,app)以使this可用之后执行。

之后,只需使用this.app创建另一个服务的实例,然后进行正确的异步调用即可。

票数 2
EN

Stack Overflow用户

发布于 2019-12-16 18:03:42

我不知道羽毛的后遗症,但根据文档的说法

对于在调用app.listen之前注册的服务,在调用app.listen时调用每个注册服务的安装函数.

通过继承Service (我不知道这是否是标准的方法),也许Service实现了setup,您可以从Properties::find()内部访问this.app

如果你没有它,那就写出来:

代码语言:javascript
复制
async find(data,params) {
...
}
async setup(app, path){
  await super.setup && super.setup(app, path)
  // for now no setup on Service
  // should Service adds a setup, it is unlikely that it wraps app to a 
  // whole new object and assigns it to this, so we can still
  // assign app to this with a relative confidence
  this.app = app
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59361549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档