2015-12-13 4 views
8

Я определяю мой апи с чем-то вроде ниже:Перьев призывающих пользовательского метод 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() от клиента?

ответ

8

Вы можете использовать только обычный служебный интерфейс на клиенте. Мы обнаружили, что поддержка пользовательских методов (и все проблемы, которые она приносит с собой, из четко определенного интерфейса для произвольных имен и параметров метода) на самом деле не нужна, потому что все само по себе можно охарактеризовать как ресурс (услугу).

Преимущества (например, безопасность, предсказуемость и отправка четко определенных событий в реальном времени) до сих пор сильно перевешивали небольшие изменения в мышлении, требуемые при концептуализации вашей прикладной логики.

В вашем примере вы могли бы сделать услугу обертку, которая получает администратора счета, как это:

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.

+0

Я полагаю, служба обертки служит моей проблеме. Правильно? –

+0

Да, я так думаю. Это немного изменилось в мышлении от метода, основанного на ресурсном подходе, но преимущества этого заслуживают, и это то, что Персы могут делать лучше всего. – Daff

+0

Спасибо. Я новичок в Node.JS в целом, пытаясь понять несколько «технологий», включая Feathers.JS, сразу. Ваша помощь действительно оценена. –