2016-08-11 68 views
2

我正在運行一個獨立的腳本來處理我的Loopback應用程序中的一些持久數據。生產應用程序運行時,我需要在生產服務器上執行此操作。我有它的工作是這樣的:在Loopback.js中,如何在不運行應用程序的情況下運行獨立腳本?

filepath是./scripts/my-script.js,看起來像這樣:

'use strict'; 

const app = require('../server/server'); 
const Account = app.models.Account; 

Account.find() 
.then(accounts => { 
    // do data stuff with accounts 
}) 
.then(() => process.exit()) 
.catch(error => { 
    console.error(error.stack); 
    process.exit(1); 
}); 

然後我跑node ./scripts/my-script.js

問題是包括Web服務器,啓動腳本等在內的整個應用程序在腳本運行期間運行,這意味着我將運行兩個應用程序實例。這是因爲我得到參考Account模式是這樣的:

const app = require('../server/server'); 
const Account = app.models.Account; 

當我嘗試:

const loopback = require('loopback'); 
const Account = loopback.getModel('Account'); 

它失敗:

./node_modules/loopback/lib/registry.js:304 throw new Error('Model not found: ' + modelName); ^

Error: Model not found: Account

我怎樣才能運行此腳本(或也許使用不同的方法)來操作持久數據而不運行應用程序的第二個實例?

回答

3

這裏您的最終目標是什麼?您可以使用loopback-connector-remote通過REST API訪問相同的應用程序實例。

您也可以通過第二個應用程序實例對相同的數據庫執行操作。

第三個選擇是創建Model類(而不是PersistedModel)的模型,定義其數據源作爲null,而不是運行第二個過程的NodeJS,你可以通過點擊相關的端點執行腳本。我只是要確保您爲該特定端點使用了良好的安全策略。

+0

感謝您的建議。我們的目標是通過腳本操作數據而不需要停機,並且不需要第二個應用程序實例。理想情況下,我不必添加應用程序代碼來執行此操作。 – guptron

+0

如果您希望運行腳本時已經運行了您的應用程序,那麼您將有權訪問該應用程序實例的唯一方法是通過REST API。只要您使用另一個Node進程運行腳本,就無法訪​​問同一個應用程序實例。 如果是我,我會創建一個端點,並在被調用時觸發指定的腳本,並設置安全性,以便只有「管理員」角色才能訪問該端點。 – richardpringle

+0

啊,我現在看到了。我可以將此端點設置爲接受'filename'參數,因此我只需修改一次實際應用程序即可添加端點。之後,我可以簡單地添加腳本,將它們推送到生產環境,然後按需求調用它們。很好的解決方法,謝謝 – guptron

相關問題