在開發環境中,啟動一個koa 應用服務,通常還需要同時啟動資料庫。比如。Mongodb、mysql 等
如果一直開著資料庫服務,在不使用的話,電腦會佔一定的效能。然而如果每次手動去啟動服務,效率又不高。因此如果我們在執行npm run start
啟動 koa 應用時,如果可以提前把需要的服務啟動起來,那麼就會效率高很多。
簡單來說就是把我們平時執行的命令寫成指令碼,在啟動時執行即可。
這裡以mongodb 為例說明這個過程。
一、mongodb 啟動指令碼
我們在應用目錄下新建指令碼檔案
/post-process/sh/mongodb.sh
#!/usr/bin/sh
dbPath=$HOME/Documents/database/mongo-db
#start up mongod service
# 這裡把mongodb 服務後臺執行,錯誤輸出重定向到 ./logs/mongod.log
mongod --dbpath ${dbPath} > ./logs/mongod.log &
二、利用child-process
執行shell 指令碼
結合nodejs 的 child_process
模組,寫一個執行指令碼的方法:
// post-process/index.js
const { exec } = require(`child_process`);
/**
* 執行一個 shell 指令碼
* @param {*} shell
*/
const excecShell = (shell) => {
exec(`sh ${shell}`, (err, stdout, stderr) => {
if (err) {
console.log(err)
return true
} else {
console.log(stdout)
}
})
}
/**
* 檢查依賴,其實就是執行一系列指令碼
*/
const dependencyCheck = (shellArray) => {
if (Array.isArray(shellArray)) {
shellArray.map(item => excecShell(item))
} else {
console.log(`Illeagal shell queue!`)
}
}
module.exports = {
excecShell: excecShell,
dependencyCheck: dependencyCheck
}
三、把檢查過程寫到config.js 中
還可以把我的執行檢查寫道config.js 中:
// config/index.js
const fs = require(`fs`)
const path = require(`path`)
let scriptPath = path.resolve(path.join(`./post-process/sh`))
//console.log(scriptPath)
module.exports = appConfig => {
// 省略
...
config = {
preChecksScripts: [
`${scriptPath}/mongodb.sh`
],
}
return config
}
四、app.js 中執行檢查過程:
const Koa = require(`koa`)
const app = new Koa()
const appConfig = require(`./config`)()
// 省略...
// 環境檢查指令碼
const preCheckTool = require(`./post-process`)
// 需要檢查的指令碼陣列
const checkScripts = appConfig.preChecksScripts
preCheckTool.dependencyCheck(checkScripts)
// ...