NodeJS+ES7+Express+MySQL打造API server最佳起手式

以往因為javascript的許多殘缺設(shè)計逻淌,使得我轉(zhuǎn)身投靠iced-coffeescript(進階版coffeescript)惜纸。老實說我用的很開心跳纳,在ES5年代忍饰,當(dāng)眾多碼農(nóng)在callback hall裡苦苦掙扎之時,我已經(jīng)愉快地使用iced-coffeescript的async/await寺庄,輕鬆解決callback hell跟ES6的Promise.all功能艾蓝。

但隨著時代的演進,javascript語言本身也進化到了ES7斗塘,源自coffeescript的胖箭頭跟async也被寫進標(biāo)準(zhǔn)了赢织,加上我受到一些啟發(fā),我想是時候重新?lián)肀S逛拱,並且好好整理一番我常用的NodeJS+Express+ES7+MySQL起手架敌厘。

首先,如果要使用async朽合,NodeJS必須升級到7.0以上俱两,過程一點都不可怕,到官網(wǎng)下載安裝檔然後下一步曹步、下一步宪彩、下一步就完成了。

此外讲婚,我還是不打算用ORM尿孔,因為只要稍微複雜一點的query,SQL還是完勝ORM

把node-mysql改成async/await

原本node-mysql的最佳實踐是用創(chuàng)造一個連線池(pool)筹麸,把connection的生命週期交給pool去管理/回收活合,標(biāo)準(zhǔn)用法如下


pool.query('SELECT * FROM User WHERE id=?',[1],(err,result) => {
    if(err) return errorHandler(res,err);
    ...
});

由於async是建構(gòu)在promise之上,而node-mysql官方似乎沒有提供promise實作物赶,所以我們必須自己包:

// db.js
const db = {
    query (query,params) {
        return new Promise(resolve, reject) {
            pool.query(query,params,(err, result) => {
                if(err) reject(err);
                else resolve(result);
            });
        }
    }
}
export default db;

正由於promise會throw exception白指,使用時也必須用try catch包住

router.get('/user/:id', async (req,res) => {
    try {
        const user = await db.query('SELECT * FROM User WHERE id=?',[req.params.id])
        const notebook = await db.query('...', otherParams)
    }
    catch (e) {
        return errorHandler(res,err)
    }
});

如果你覺得每次都要try catch太瑣碎,這裡有解決方案A酵紫、解決方案B告嘲、解決方案C错维,注意的是,當(dāng)你有多個query時橄唬,用try-catch還是比較省心赋焕。

require進化成import

很不幸地,NodeJS 7.0還是不支援import仰楚,必須用babel轉(zhuǎn)譯隆判,而且整個app啟動時必須先require('babel-register'),最佳實踐如下

  1. 修改package.json僧界,然後npm install
"scripts": {
    //假設(shè)用node-dev
    "dev": "node-dev --use_strict ./bin/index"
  },
"devDependencies": {
    "MD5": "~1.2.0",
    "babel-cli": "^6.24.1",
    "babel-preset-es2015-node4": "^2.1.0",
    "babel-preset-stage-3": "^6.5.0",
    "babel-register": "^6.6.5",
    ...
}
  1. 新增.babelrc
{
      "presets": ["es2015-node4", "stage-3"]
}
  1. 新增./bin/index.js
require('babel-register');
require('../app.js');
  1. npm run dev
整理router

未完待續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜜氨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子捎泻,更是在濱河造成了極大的恐慌飒炎,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笆豁,死亡現(xiàn)場離奇詭異郎汪,居然都是意外死亡,警方通過查閱死者的電腦和手機闯狱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進店門煞赢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哄孤,你說我怎么就攤上這事照筑。” “怎么了瘦陈?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵凝危,是天一觀的道長。 經(jīng)常有香客問我晨逝,道長蛾默,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任捉貌,我火速辦了婚禮支鸡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘趁窃。我一直安慰自己牧挣,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布醒陆。 她就那樣靜靜地躺著瀑构,像睡著了一般。 火紅的嫁衣襯著肌膚如雪统求。 梳的紋絲不亂的頭發(fā)上检碗,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天,我揣著相機與錄音码邻,去河邊找鬼折剃。 笑死,一個胖子當(dāng)著我的面吹牛像屋,可吹牛的內(nèi)容都是我干的怕犁。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼己莺,長吁一口氣:“原來是場噩夢啊……” “哼奏甫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凌受,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤阵子,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后胜蛉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挠进,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年誊册,在試婚紗的時候發(fā)現(xiàn)自己被綠了领突。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡案怯,死狀恐怖君旦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嘲碱,我是刑警寧澤金砍,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站麦锯,受9級特大地震影響捞魁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜离咐,卻給世界環(huán)境...
    茶點故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一谱俭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宵蛀,春花似錦昆著、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至梧宫,卻和暖如春接谨,著一層夾襖步出監(jiān)牢的瞬間摆碉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工脓豪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巷帝,地道東北人。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓扫夜,卻偏偏與公主長得像楞泼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子笤闯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,595評論 2 350

推薦閱讀更多精彩內(nèi)容