我用下面的内容定义我的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); }
当我想使用数据库适配器方法时,从客户端,即查找和/或创建,我执行以下操作:
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());
或者,您可以实现一个钩子,将查询参数映射到更大的查询,如下所示:
app.service('/api/accounts').hooks({ before: { find(hook) { if(hook.params.query.admin) { hook.params.query.adminProfile = { $exists: true }; } } } });
这现在可以调用类似的东西/api/accounts?admin
.
有关更多信息,请参阅此FAQ.