2015-12-07 22 views
2

期望的結果之前或之後執行在KOA一些數據庫命令

我要檢查或在我的節點+ KOA + MySQL服務器的啓動數據庫的狀態,應用更新腳本如果需要。在server.js如何app.listen()

最佳流量

  1. 設置MySQL連接
  2. 檢查並更新數據庫
    • 玉石俱焚是否存在與更新腳本或意外的錯誤中的問題更新過程。
  3. 添加路由
  4. 啓動服務器

我的數字數據庫的更新可以在任何時候#1後進行的,但我一直沒太成功了呢。

我將我的工作重點放在來自https://github.com/chrisveness/koa-sample-web-app-api-mysql的示例代碼上,儘管它只關注api更簡單。

代碼片段

// schema/fate2.js 
const versionModel = require('../models/version'); 
module.exports = function* updateToHead() { 
    yield versionModel.init(); 
    try { 
    yield syncTrunkAndDev(); 
    } catch (e) { 
    console.log("Latest trunk schema version is: " + versionModel.getTrunkLast()); 
    console.log("Latest dev schema version is: " + versionModel.getDevLast()); 
    throw "Error in upgrading", e; 
    } 
} 

// server.js 
app.use(require('./schema/fate2')); 
... 
app.listen(process.env.PORT||3030); 

// models/version.js 
const Version = module.exports = {}; 

Version.init = function*() { 
    yield GLOBAL.db.query(
    "CREATE TABLE IF NOT EXISTS version (" + 
    " id int(11) NOT NULL," + 
    " dev int(1) NOT NULL," + 
    " description varchar(50) NOT NULL," + 
    " applied_on timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP," + 
    " dirty int(1) NOT NULL DEFAULT '1'," + 
    " PRIMARY KEY (id)" + 
    ") ENGINE=InnoDB DEFAULT CHARSET=utf8" 
); 
}; 

其它計算器職位

How to perform initial setup in koa with rethinkdb - 我讀了這一個,嘗試過,但它似乎並沒有做任何事情。

回答

1

最簡單的解決方案可能是將app.listen包裝在co進程中,以便在引導服務器之前順序產生啓動過程。

如果其中任何一個拋出,則執行會跳過app.listen您可以輕鬆地捕獲所有異常在一個地方:

const co = require('co'); 

co(function*() { 
    yield require('./schema/fate2'); 
    yield require('./models/version').init(); 
    app.listen(3000, function() { console.log('listening on 3000') }); 
}).catch(function(err) { 
    console.error('Server boot failed:', err, err.stack); 
}); 

我也偶然發現https://github.com/node-modules/ready-callback之前在Github上,但目前沒有進一步的說關於它。