2016-11-11 8 views
0

В контексте удаленного метода я пытаюсь определить модельную схему параметра, переданного в теле. Этот объект выглядит следующим образом:Встраиваемый объект в схему схемы loopback для Swagger

{ 
    name: "Alex", 
    credentials: { 
     user: "alex", 
     pass: "pass" 
    } 
} 

Итак, у меня есть этот код в моем удаленном определении метода:

MyModel.remoteMethod("postSomething", { 
    accepts: [ 
     {arg: 'person', type: { 
      "name": "string", 
      "credentials": { 
      "type": "object", 
      "properties": { 
       "user": "string", 
       "pass: "string" 
      } 
      } 
     }, http: {source: 'body'}, required: true 
     } 
    ], 
..... 

Unfortunatelly, детали этого внедренного объекта (мандатной) не отображаются в создаваемом Swagger исследователь. Это то, что я вижу:

{ 
    "user": "string", 
    "credentials": {} 
} 

Я пробовал много разных способов, но я не мог показать свойства объекта учетных данных.

Любые идеи?

ответ

0

Loopback swagger только поднимает внешний объект, игнорируя свойства объекта. Если вы хотите показать вложенные объекты в документах swagger для тела запроса, вам нужно будет создать вложенную модель.

Предполагая, что у вас есть модель, называемая человеком. Вы должны создать еще одну модель с именем «учетные данные», имеющую свойства пользователя и пароль. Затем определяют отношения в конфигурации вашей персоне модели

{ 
    "name": "Person", 
    "base": "PersistedModel", 
    "idInjection": true, 
    "options": { 
    "validateUpsert": true 
    }, 
    "properties": { 
    "name": { 
     "type": "string", 
     "required": true 
    } 
    }, 
    "validations": [], 
    "relations": { 
    "credentials": { 
     "type": "embedsOne", 
     "model": "credentials", 
     "property": "credentials", 
     "options": { 
     "validate": true, 
     "forceId": false 
     } 
    } 
    }, 
    "acls": [], 
    "methods": {} 
} 

И добавить ссылку на эту модель, в которой вы определяете ваш удаленный метод

MyModel.remoteMethod("postSomething", { 
    accepts: [ 
     {arg: 'person', type: {Person}, 
     http: {source: 'body'}, required: true 
     } 
    ], 

Чтобы избежать «Лечение неизвестного типа удаленного взаимодействия» предупреждение убедитесь, что ваша модель помечается как "общественное" внутри "модели-config.json"

+0

@Aleks Помог ли мой ответ решить вашу проблему – abhinav

3

Loopback 2.x

Edit: Примечание следующее работает только для Loopback 2.x, так как реестр типов изменен в 3.x.

Проблема в том, что данные, которые вы предоставляете, должны находиться в свойстве type для вложенного значения. Это должно работать:

MyModel.remoteMethod('postSomething', { 
accepts: [ 
    { 
    arg: 'person', 
    type: { 
     name: 'string', 
     credentials: { 
     type: { 
      user: 'string', 
      pass: 'string' 
     } 
     } 
    }, 
    http: { 
     source: 'body' 
    }, 
    required: true 
    } 
], 
//... 

Это также работает с массивами:

accepts: [ 
    { 
    arg: 'Book', 
    type: { 
     title: 'string', 
     author: 'string', 
     pages: [{ 
     type: { 
      pageNo: 'number', 
      text: 'string' 
     } 
     }] 
    } 
    } 
], 
// ... 

Loopback 3.x

Поскольку модель реестра и сильного Remoting изменилось в Loopback 3.x, чтобы только строки или массива, вы не можете избежать создания новой модели. Если вы хотите, чтобы быстро «инлайн» модель, не проходя через весь процесс добавления файла модели JSon, добавив его в model-config.json и т.д. Вы можете зарегистрировать его непосредственно на приложение:

app.registry.createModel('Person', { 
    firstName: 'string', 
    lastName: 'string' 
}, { base: 'Model' }); 

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

Если вы хотите создать модель без загромождения вашей модели реестра, вы можете сделать это по телефону createModel на loobpack себя:

const loopback = require('loopback') 
const modl = loopback.createModel({ 
    name: 'Person', 
    base: null, 
    properties: { 
     firstName: { 
     type: 'string', 
     id: true // means it won't have an id property 
     } 
    } 
    }); 

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

accepts: [ 
    { 
    arg: 'Person', 
    type: 'Person' 
    } 
], 
// ... 

Примечание вам нужно будет создать суб-модели для каждого дополнительного свойства (например, учетные данные)

+0

это не работает после Loopback3. type принимает только строку или массив. –

+0

Это правильно. Способ работы реестра типов был изменен в loopback 3. Если вы хотите сделать что-то вроде запрошенного OP, вам необходимо либо зарегистрировать свой собственный пользовательский тип, либо создать другую модель, как предлагал @abhinav. –

+0

как зарегистрировать пользовательский тип без определения модели? –

 Смежные вопросы

  • Нет связанных вопросов^_^