我应该如何将LoopBack Framework应用程序连接到预先存在/数据填充的MySQL数据库/数据源?

时间:2017-03-02 17:42:55

标签: mysql node.js loopbackjs loopback

此问题专门针对StrongLoop的LoopBack Node.js Framework(由IBM拥有/由IBM支持)。据我所知,到目前为止,这应该是一个两步过程。

  1. 编写脚本以从现有的MySQL Schema中发现/创建模型。以下是有关该文件的官方文档:https://loopback.io/doc/en/lb3/Discovering-models-from-relational-databases.html
  2.   

    认为我使用以下NPM包成功处理了发现/模型创建部分:https://www.npmjs.com/package/loopback-discovery(项目的GitHub repo可在此处找到:https://github.com/akera-io/loopback-discovery

    1. 使用AutoUpdate(通过loopback-project / server / boot目录中的脚本)检查以确保MySQL DB符合Discovery / Creation模块创建的Model定义。这是关于LoopBack的AutoMigrate和AutoUpdate函数之间差异的StackOverflow主题:loopback automigrate vs autoupdate
    2. 从那里我认为我应该能够访问我的API并访问MySQL数据源中的数据,但是唉......

      当我完成上述步骤时,我成功地从loopback-project / common / models目录中的所选表中获取了所有模型(我的模型碰巧是来自博客的帖子)。

      在我的loopback-project / server / model-config.json中,我的MySQL数据库中的所有表/模型都存在,然后我将“posts”模型设置为public,以便通过API公开它。

      由于上面讨论的NPM模块使用LoopBack和LoopBack数据源,我知道我可以连接到我的数据库,我的loopback-project / server / datasource.js文件正确配置环回以与我的服务器/ mysql实例通信。

      当我使用node启动我的loopback实例时。我可以点击http://0.0.0.0/explore,我的“帖子”模型的CRUD选项正如我所期望的那样。

      但是。

      当我尝试通过GET Posts Api Endpoint查询我的数据库时,我收到以下错误:我的表不存在(即使它在MySQL中显然也是如此,因为我的博客正在使用它并且之前的NPM包能够从它:

      {
        "error": {
          "statusCode": 500,
          "name": "Error",
          "message": "ER_NO_SUCH_TABLE: Table 'my_mysqlDB.Posts' doesn't exist",
          "code": "ER_NO_SUCH_TABLE",
          "errno": 1146,
          "sqlState": "42S02",
          "index": 0,
          "stack": "Error: ER_NO_SUCH_TABLE: Table 'my_mysqlDB.Posts' doesn't exist\n    at Query.Sequence._packetToError (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/sequences/Sequence.js:52:14)\n    at Query.ErrorPacket (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/sequences/Query.js:77:18)\n    at Protocol._parsePacket (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Protocol.js:280:23)\n    at Parser.write (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Parser.js:75:12)\n    at Protocol.write (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Protocol.js:39:16)\n    at Socket.<anonymous> (/app/AvailableTripsLBcode/node_modules/mysql/lib/Connection.js:103:28)\n    at emitOne (events.js:96:13)\n    at Socket.emit (events.js:188:7)\n    at readableAddChunk (_stream_readable.js:176:18)\n    at Socket.Readable.push (_stream_readable.js:134:10)\n    at TCP.onread (net.js:551:20)\n    --------------------\n    at Protocol._enqueue (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Protocol.js:141:48)\n    at PoolConnection.query (/app/AvailableTripsLBcode/node_modules/mysql/lib/Connection.js:208:25)\n    at runQuery (/app/AvailableTripsLBcode/node_modules/loopback-connector-mysql/lib/mysql.js:186:16)\n    at executeWithConnection (/app/AvailableTripsLBcode/node_modules/loopback-connector-mysql/lib/mysql.js:228:7)\n    at Ping.onOperationComplete [as _callback] (/app/AvailableTripsLBcode/node_modules/mysql/lib/Pool.js:110:5)\n    at Ping.Sequence.end (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/sequences/Sequence.js:86:24)\n    at Ping.Sequence.OkPacket (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/sequences/Sequence.js:95:8)\n    at Protocol._parsePacket (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Protocol.js:280:23)\n    at Parser.write (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Parser.js:75:12)\n    at Protocol.write (/app/AvailableTripsLBcode/node_modules/mysql/lib/protocol/Protocol.js:39:16)\n    at Socket.<anonymous> (/app/AvailableTripsLBcode/node_modules/mysql/lib/Connection.js:103:28)\n    at emitOne (events.js:96:13)\n    at Socket.emit (events.js:188:7)\n    at readableAddChunk (_stream_readable.js:176:18)\n    at Socket.Readable.push (_stream_readable.js:134:10)\n    at TCP.onread (net.js:551:20)"
        }
      }
      
        

      我只关心我的数据库(帖子)上的一个表,我只需要读不写/写。我不确定我是否需要所有其他模型的模型在common / models目录中,或者如果我只能拥有与数据源上的'posts'表相关的Posts模型,为此我尝试了两种方式没有运气。

      我觉得有些东西我想念LoopBack如何处理基于模型的模式创建,但我还没有运气解决它。

      其他一些说明/细节。

      1. 通过AutoMigrate重新创建不是一个选项,因为它会丢弃表并重新创建,从而丢失所有数据(这是我首先需要连接的唯一原因)。

1 个答案:

答案 0 :(得分:2)

如果您的模型名为"Post",则环回将在Post中查找mysql表。

    "name": "Post",
  "options": {
    "idInjection": false,
    "mysql": {
      "schema": "LOOPBACK",
      "table": "post"
    }
  }

在post.json文件中添加它,它将起作用