Feathers 调用自定义 API 方法
Feathers calling custom API method
我用下面的内容定义我的 api:
class MyFeathersApi {
feathersClient: any;
accountsAPI: any;
productsAPI: any;
constructor(app) {
var port: number = app.get('port');
this.accountsAPI = app.service('/api/accounts');
this.productsAPI = app.service('/api/products');
}
findAdminAccounts(filter: any, cb: (err:Error, accounts:Models.IAccount[]) => void) {
filter = { query: { adminProfile: { $exists: true } } }
this.accountsAPI.find(filter, cb);
}
当我想从客户端使用数据库适配器方法时,即找到 and/or 创建,我执行以下操作:
var accountsAPIService = app.service('/api/accounts');
accountsAPIService.find( function(error, accounts) {
...
});
如何从客户端调用自定义方法,例如 findAdminAccounts()?
您只能在客户端使用正常的服务界面。我们发现对自定义方法的支持(以及它带来的所有问题,从明确定义的接口到任意方法名称和参数)并不是真正必要的,因为一切本身都可以描述为资源(服务)。
到目前为止,好处(例如安全性、可预测性和发送明确定义的实时事件)远远超过了在概念化您的应用程序逻辑时所需的思维上的微小变化。
在您的示例中,您可以制作一个包装器服务来获取管理员帐户,如下所示:
class AdminAccounts {
find(params) {
const accountService = this.app.service('/api/accounts');
return accountService.find({ query: { adminProfile: { $exists: true } } });
}
setup(app) {
this.app = app;
}
}
app.use('/api/adminAccounts', new AdminAccounts());
或者,您可以实施 hook 将查询参数映射到更大的查询,如下所示:
app.service('/api/accounts').hooks({
before: {
find(hook) {
if(hook.params.query.admin) {
hook.params.query.adminProfile = { $exists: true };
}
}
}
});
现在可以调用 /api/accounts?admin
.
有关详细信息,请参阅 this FAQ。
我用下面的内容定义我的 api:
class MyFeathersApi {
feathersClient: any;
accountsAPI: any;
productsAPI: any;
constructor(app) {
var port: number = app.get('port');
this.accountsAPI = app.service('/api/accounts');
this.productsAPI = app.service('/api/products');
}
findAdminAccounts(filter: any, cb: (err:Error, accounts:Models.IAccount[]) => void) {
filter = { query: { adminProfile: { $exists: true } } }
this.accountsAPI.find(filter, cb);
}
当我想从客户端使用数据库适配器方法时,即找到 and/or 创建,我执行以下操作:
var accountsAPIService = app.service('/api/accounts');
accountsAPIService.find( function(error, accounts) {
...
});
如何从客户端调用自定义方法,例如 findAdminAccounts()?
您只能在客户端使用正常的服务界面。我们发现对自定义方法的支持(以及它带来的所有问题,从明确定义的接口到任意方法名称和参数)并不是真正必要的,因为一切本身都可以描述为资源(服务)。
到目前为止,好处(例如安全性、可预测性和发送明确定义的实时事件)远远超过了在概念化您的应用程序逻辑时所需的思维上的微小变化。
在您的示例中,您可以制作一个包装器服务来获取管理员帐户,如下所示:
class AdminAccounts {
find(params) {
const accountService = this.app.service('/api/accounts');
return accountService.find({ query: { adminProfile: { $exists: true } } });
}
setup(app) {
this.app = app;
}
}
app.use('/api/adminAccounts', new AdminAccounts());
或者,您可以实施 hook 将查询参数映射到更大的查询,如下所示:
app.service('/api/accounts').hooks({
before: {
find(hook) {
if(hook.params.query.admin) {
hook.params.query.adminProfile = { $exists: true };
}
}
}
});
现在可以调用 /api/accounts?admin
.
有关详细信息,请参阅 this FAQ。