Swagger的环回模型模式中的嵌入对象

时间:2016-11-11 11:39:08

标签: swagger loopbackjs

在远程方法的上下文中,我试图定义在主体中传递的参数的模型模式。该对象如下所示:

{
    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
      }
    ],
.....

不幸的是,生成的Swagger资源管理器中未显示此嵌入对象(凭据)的详细信息。这就是我所看到的:

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

我尝试了很多不同的方法,但是我无法显示凭证对象的属性。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

Loopback 2.x

编辑:注意以下内容仅适用于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

由于模型注册表和强大的远程处理在Loopback 3.x中更改为仅允许字符串或数组类型,因此您无法真正避免创建新模型。如果你想快速内联'一个模型没有经过添加模型json文件的完整过程,将其添加到model-config.json等等,您可以直接在应用程序上注册它:

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

如果要扩展现有模型,可以将基数设置为其他模型之一(例如,添加仅在给定远程方法中接受的另一个属性)

如果您想在不混淆模型注册表的情况下创建模型,可以通过在loobpack上调用createModel来实现:

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'
  }
],
// ...

请注意,您需要为每个子属性(例如凭证)

创建子模型

答案 1 :(得分:0)

Loopback swagger仅捕获外部对象而忽略对象的属性。 如果要在请求正文的swagger文档中显示嵌套对象,则必须创建嵌套模型。

假设您有一个名为person的模型。你必须创建另一个名为"凭证"拥有属性用户和密码。然后在您的人物模型配置中定义关系

{
  "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
      }
    ],

避免"处理未知的远程类型"警告确保您的模型标记为" public"在你的" model-config.json"