2017-03-02 39 views
0

此問題特別針對StrongLoop的LoopBack Node.js Framework(由IBM擁有/支持)。從我迄今所知的情況來看,這應該是一個兩步過程。我應該如何將LoopBack框架應用程序連接到預先存在的/數據填充的MySQL數據庫/數據源?

  1. 編寫腳本以從現有的MySQL模式中發現/創建模型。以下是有關的官方文檔:https://loopback.io/doc/en/lb3/Discovering-models-from-relational-databases.html

認爲我成功地使用下面的NPM包處理的發現/模型創建片:https://www.npmjs.com/package/loopback-discovery(項目GitHub庫可以在這裏找到:https://github.com/akera-io/loopback-discovery

  1. 使用AutoUpdate(通過loopback-project/server/boot目錄中的腳本)檢查以確保MySQL數據庫符合Discovery/Creation創建的Model定義模塊。下面是對回的AutoMigrate和自動更新功能之間的差異StackOverflow的話題:loopback automigrate vs autoupdate

從那裏我認爲我應該能夠打到我的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實例通信。

當我啓動我的環回實例使用節點。我可以打到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)" 
    } 
} 

我只關心一個表對我的DB(職位),我只需要讀取未/寫我不知道如果我需要模型,所有其他車型要英寸common/models目錄,或者如果我只有我的Posts模型與我的數據源上的'posts'表相關,那麼我已經嘗試了兩種方式,沒有運氣。

我覺得我缺少一些關於LoopBack如何基於模型處理模式創建的問題,但我還沒有解決它的問題。

其他一些筆記/細節。

  1. 通過AutoMigrate重新創建不是一個選項,因爲它會丟棄表並重新創建,從而丟失所有數據(這是我首先需要連接的唯一原因)。
+0

是名爲「郵報」的模式?什麼是相應的表名? – itssajan

+0

@itssajan模型名稱是發佈,表名是發佈。 在你的評論和GitHub上看到的問題後,我使用以下標誌/環境變量來輸出由LoopBack生成的SQL查詢,看看是否給出了任何線索,要做到這一點我跑: export DEBUG = loopback:連接器:mysql 真的很有幫助,因爲它表明無論什麼原因,即使表格被設置爲common/models/Posts.js中的「posts」,生成的SQL查詢使用「Posts」(大寫)表名。 – Necevil

回答

2

如果模型名爲"Post",然後回送將在mysql尋找Post表。

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

在post.json文件中添加這和它的工作

+0

好答案,但我仍然有問題。直到我將LoopBack模型名稱更改爲「posts」,它才起作用!我不知道我是否應該在GitHub上發佈更多的細節/問題到LoopBack,但是我接受了答案,因爲解決方案是你的! Thanks @itssajan – Necevil

+0

你可以把你的json文件? – itssajan

相關問題