Loopback.io属于REST

时间:2015-11-03 21:44:44

标签: loopbackjs strongloop

我对loopback.io

的belongsTo关系函数感到有点困惑

因此,让我们采取以下示例:

我有一个名为项目的模型,该模型与客户对象有关。所以项目属于客户。

这是我的项目模型

{
  "name": "Project",
  "plural": "Projects",
  "base": "PersistedModel",
  "strict": false,
  "idInjection": false,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "title": {
      "type": "string",
      "required": true
    },
    "description": {
      "type": "string"
    },
    "dateCreated": {
      "type": "date"
    }
  },
  "validations": [],
  "relations": {
    "customer": {
      "type": "belongsTo",
      "model": "Customer",
      "foreignKey": "customerId"
    }
  },
  "acls": [],
  "methods": {}
}

因此,当我运行应用程序并转到http://0.0.0.0:3000/explorer时,我可以看到API。但是当我去项目时我只看到

 GET /Projects/{id}/customer     Fetches belongsTo relation customer.

我还期待其他功能,比如

 POST /Projects/{id}/customer 
 DELETE /Projects/{id}/customer 

为什么这里没有?或者我如何通过REST API为项目设置客户?

3 个答案:

答案 0 :(得分:3)

让我们首先了解 belongsTo 关系,了解为什么只创建GET休息端点:

GET /Projects/{id}/customer     Fetches belongsTo relation customer.

为什么Loopback没有创建以下链接:

POST /Projects/{id}/customer 
DELETE /Projects/{id}/customer

belongsTo 关系会在两个模型实例之间创建一对一的关系。它用于将一个实例的所有权提供给另一个实例。在您的情况下,项目模型实例属于客户模型实例。现在,由于项目属于客户,因此客户拥有项目实例以及其他端点的解释。

GET /Projects/{id}/customer     Fetches belongsTo relation customer.

由于客户可以拥有项目实例,因此上述内容是有效的,因为客户可以获取项目。

POST /Projects/{id}/customer
DELETE /Projects/{id}/customer

由于客户不属于项目而不属于项目,因此上述休息端点在创建或拒绝其所有者(客户)的项目时没有意义。

答案 1 :(得分:2)

首先,您的Project模型缺少您为belongsTo关系提到的customerId字段。

这是项目模型

{
  "name": "Project",
  "plural": "Projects",
  "base": "PersistedModel",
  "strict": false,
  "idInjection": false,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "title": {
      "type": "string",
      "required": true
    },
    "description": {
      "type": "string"
    },
    "dateCreated": {
      "type": "date"
    },
    "customerId": {
      "type": "string",
      "required":true
  },
  "validations": [],
  "relations": {
    "customer": {
      "type": "belongsTo",
      "model": "Customer",
      "foreignKey": "customerId"
    }
  },
  "acls": [],
  "methods": {}
}

现在,您的客户模型还应该包含 hasMany 关系的其他部分。没有它,它将无法按预期工作。

以下是客户模型的代码

{
  "name": "Customer",
  "plural": "Customers",
  "base": "PersistedModel",
  "strict": false,
  "idInjection": false,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "name": {
      "type": "string",
      "required": true
    },
    "email": {
      "type": "string",
      "required": true
    },
    "dateCreated": {
      "type": "date"
    }
  },
  "validations": [],
  "relations": {
    "projects": {
      "type": "hasMany",
      "model": "Project",
      "foreignKey": "customerId"
    }
  },
  "acls": [],
  "methods": {}
}

现在来自客户< - >的双方关系项目已定义,您的API应具有以下端点:

GET Customers/{id}/Projects
POST Customers/{id}/Projects
PUT Customers/{id}/Projects

您提到的端点无效,因为您无法为项目创建客户,但其他方式。

答案 2 :(得分:0)

据我所知,它并不像那样。要创建链接,您需要创建客户,然后将该客户的ID用作项目模型中的ID。

所以您的API调用将是:

  

POST / Customer

创建Customer,然后是

  

POST / Project

创建项目。

在第二篇文章中,您需要指定CustomerId以将项目链接到客户,或者您需要在事后用customerId更新项目。

然后:

  

项目/ {ID} /客户

检索属于项目的客户。

或者您可以在其中一个模型上编写自己的远程方法,以便在一次调用中执行此操作。

关系API的完整列表可以在这里找到:

StrongLoop Relations API