我试图在我的find()应用程序中扩展一个名为properties的服务的FeathersJS方法。
我需要的是在find()返回的所有记录中附加一个数组,其中包含来自另一个名为propertyadds的服务的整数。这意味着我需要改变我的反应
{
"total": 2973,
"limit": 10,
"skip": 0,
"data": [
{
"id": 1,
...
},
{
"id": 2,
...
}
...
]
}至
{
"total": 2973,
"limit": 10,
"skip": 0,
data: [
{
"id": 1,
...
"additionals": [10,20,30]
},
{
"id": 2,
...
"additionals": [12,25,33]
}
...
]
}中的值来自service propertyadds,该服务管理一个表,如
| property_id | additional_id |
|-------------|---------------|
| 1 | 10 |
| 1 | 20 |
| 1 | 30 |
| 2 | 12 |
| 2 | 25 |
| 2 | 33 |
|-------------|---------------|我最初的想法是像这样扩展properties服务
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访问这个模块中的所有服务?
发布于 2019-12-16 20:34:16
事实上,当我访问src/services/properties.service.js并发现这一行时,解决方案就实现了。
app.use('/properties', new Properties(options, app));因此,服务properties实际上是在其创建过程中接收到一个app对象。
学习这一点使我看到了正确的解决方案,用src/services/properties/properties.class.js编写,如下所示:
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创建另一个服务的实例,然后进行正确的异步调用即可。
发布于 2019-12-16 18:03:42
我不知道羽毛的后遗症,但根据文档的说法
对于在调用app.listen之前注册的服务,在调用app.listen时调用每个注册服务的安装函数.
通过继承Service (我不知道这是否是标准的方法),也许Service实现了setup,您可以从Properties::find()内部访问this.app
如果你没有它,那就写出来:
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
}https://stackoverflow.com/questions/59361549
复制相似问题