【问题标题】:Strongloop EmbedsMany helper methods not foundStrongloop EmbedsMany helper methods not found
【发布时间】:2025-12-16 11:25:01
【问题描述】:

一些我在文档中找不到答案的问题。

我正在尝试获得这样的结构:

 Node: 
   id: '1sdf12asd123',
   name: 'node1',
   history: 
      [ ts: 234234234234,
        data: { 'foo': 'bar' }
      ],
      ...

所以每个单独的节点都有许多历史项目。我希望能够push 新数据,而不会覆盖任何内容。

现在,我不想将所有内容存储在每个节点下,而是存储在单独的文档中,所以我认为 embedsMany 适合此:

{
  "name": "Node",
  "plural": "Nodes",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "name": {
      "type": "string"
    }
  },
  "validations": [],
  "relations": {
    "history": {
      "type": "embedsMany",
      "model": "History",
      "foreignKey": "HistoryId"
    }
  },
  "acls": [],
  "methods": {}
}

所以历史很简单:

{
  "name": "History",
  "base": "PersistedModel",
  "idInjection": true,
  "properties": {
    "ts": {
      "type": "Date"
    },
    "data": {
      "type": "Object"
    }
  },
  "validations": [],
  "relations": {
    "node": {
      "type": "belongsTo",
      "model": "Node",
      "foreignKey": "NodeId"
    }
  },
  "acls": [],
  "methods": {}
}

我不确定 foreignKey 部分是否正确,但我尝试了很多不同的组合,这似乎合乎逻辑。

History 模型不是公开的,因此不会作为端点公开。而且我想尽可能地利用关系,而不是有一个单独的端点。

这里的主要问题是我想使用Nodes.history.add(),就像描述的here一样。

但是我已经尝试了从Remote methodsOperation Hooks 的所有不同方法,但我找不到提到的辅助方法。没有关于此的代码示例。

我认为部分原因是文档有时不是很清楚,或者假设对其他 API 框架的工作方式有一定程度的了解。我已经阅读了要找到的每一页文档。 (一个例子是Core concepts 页面链接到已弃用的Model hooks 页面。)

我想知道的:

  1. 是使用.add() 权限在模型上推送数据的想法,并让环回管理它应该存储它的位置,所以当我查询节点时,我会取回所有history 项目,除非我阻止在服务器端(因为我不希望节点数据本身的每个请求都如此。
  2. 最好为每个历史项目创建一个单独的文档,其中包含 nodeId,还是更好地为每个节点创建一个历史项目,并将历史存储在其中?对我来说主要问题是,我如何push 数据,而不覆盖任何内容,也许使用timeStamp 作为密钥?
  3. History 模型是否需要知道它们与 NodesBelongsTo 的关系,或者它是否可以忽略它而仍然拥有 Nodes .add() 每个历史记录项?

【问题讨论】:

    标签: javascript node.js loopbackjs strongloop


    【解决方案1】:

    如果我正确理解您的问题,您可以改用 Node hasMany History。然后使用从关系生成的所有方法:

    使用关系创建新的历史记录

    POST api/Node/{NodeId}/Histories/ 
    

    通过适当地写入 JSON 数据,您应该能够使用单个 POST 请求创建多个 History 实例

    {
        {
           ts: 26283829879
        },
        {
           ts: 5335329923
        }
    }
    

    从节点获取单个历史记录

    GET api/Node/{NodeId}/Histories/{HistoryId}/
    

    您还可以从节点获取所有历史记录、编辑给定节点的任何历史记录等。

    这有用吗?

    请参阅 HasMany relations 的 StrongLoop 文档。

    【讨论】:

    • 我需要能够同时.add多个historyItems。
    • 没有什么能阻止你这样做。我相信 Persisted 模型本身就支持这一点。请参阅apidocs.strongloop.com/loopback/#persistedmodel-create 可选数据参数。可以是单个模型实例或实例数组。我已经编辑了我的帖子,看看是否能解决你的问题。
    • 问题在于,我不想create Node,它已经在那里了,所以我必须在findById 中使用它,然后添加一些东西......
    • POST api/Node/{NodeId}/Histories/ 不会创建Node,只是创建History 的实例并初始化它们与id 为NodeId 的节点的关系。这是你要找的吗?