在使用諸如restify/expressjs等Nodejs Web Framework時,咱們最頭疼的問題就是回調黑洞。node
雖而後又Koa/Koa2號稱「The Next Framework」使用co解決問題,可是核心this的設計和各類小流middleware對req/res的隨意濫用,致使我對這個框架失去好感。git
Expressjs依然是我在使用Nodejs編寫API和Web時的首選框架。github
在使用Expressjs時,若是咱們也想使用await/async這些在ES7 stage-3中的特性,就須要藉助別的工具。目前我推薦的是typescript(時下版本2.0.10)和babel,本章只介紹使用babel的方法,若有同窗與我同樣一樣對ts興趣甚深,可私信或留言彼此學習進步。typescript
第一步express
咱們仍然使用npm init來生成一個package,內容以下:npm
1 { 2 "name": "express_babel_demo2", 3 "version": "1.0.0", 4 "description": "", 5 "main": "index.js", 6 "scripts": { 7 "test": "echo \"Error: no test specified\" && exit 1" 8 }, 9 "author": "", 10 "license": "ISC", 11 "dependencies": { 12 "babel-core": "^6.18.2", 13 "babel-preset-es2015": "^6.18.0", 14 "babel-preset-stage-3": "^6.17.0", 15 "babel-runtime": "^6.18.0", 16 "bluebird": "^3.4.6", 17 "express": "^4.14.0" 18 }, 19 "devDependencies": { 20 "babel-plugin-transform-runtime": "^6.15.0" 21 } 22 }
能夠看到,在咱們的依賴中,已經存在babel-core等組件,bluebird是我最喜歡的一個Promise A+實現,性能也是真男人。json
第二步瀏覽器
而後咱們新建一個.babelrc,用來描述babel的配置:babel
1 { 2 "presets": [ 3 "stage-3", 4 "es2015" 5 ], 6 "plugins": [ 7 [ 8 "transform-runtime", 9 { 10 "polyfill": false, 11 "regenerator": true 12 } 13 ] 14 ] 15 }
咱們使用babel官方推薦的transform-runtime來進行啓動翻譯工做,而不是pollify,雖而後者有更多的功能,可是對於不須要的人來講,那是對原生對象的污染和項目性能的負擔。app
第三步
新建一個index.js文件,這個是demo的啓動文件,代碼依舊簡單,引入babel、babel翻譯和expressjs的入口:
1 require('babel-core/register'); 2 require('./app.js'); 3 require("babel-core").transform("code", { 4 plugins: ["transform-runtime"] 5 });
第四步
編寫一個app.js,使用原生fs庫異步讀取一下package.json文件並輸出:
1 var express = require('express'); 2 var app = express(); 3 var fs = require('fs'); 4 var Promise = require('bluebird'); 5 6 app.get('/', function (req, res) { 7 testAsync(); 8 res.send('Hello World!'); 9 }); 10 11 var server = app.listen(3000, function () { 12 var host = server.address().address; 13 var port = server.address().port; 14 15 console.log('Example app listening at http://%s:%s', host, port); 16 }); 17 18 19 20 async function testAsync(name) { 21 console.log("hello"); 22 for (let i = 0; i < 3; i++) { 23 let fileContent = await readFile("package.json"); 24 console.log(new Buffer(fileContent).toString()); 25 console.log("."); 26 } 27 console.log(name); 28 } 29 let readFile = Promise.promisify(fs.readFile);
而後執行一下npm install,會下載依賴
再node index.js啓動咱們所編寫的express demo。
瀏覽器訪問localhost:3000,在控臺裏就能看到「異步讀取、同步輸出」的內容了。
demo github地址:GitHub Demo