博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用async/await——Nodejs+ExpressJs+Babel
阅读量:6306 次
发布时间:2019-06-22

本文共 2593 字,大约阅读时间需要 8 分钟。

在使用诸如restify/expressjs等Nodejs Web Framework时,我们最头疼的问题就是回调黑洞。

虽然后又Koa/Koa2号称“The Next Framework”使用co解决问题,但是核心this的设计和各种小流middleware对req/res的随意滥用,导致我对这个框架失去好感。

Expressjs依然是我在使用Nodejs编写API和Web时的首选框架。

在使用Expressjs时,如果我们也想使用await/async这些在ES7 stage-3中的特性,就需要借助别的工具。目前我推荐的是typescript(时下版本2.0.10)和babel,本章只介绍使用babel的方法,如有同学与我一样同样对ts兴趣甚深,可私信或留言彼此学习进步。

第一步

我们仍然使用npm init来生成一个package,内容如下:

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+实现,性能也是真男人。

第二步

然后我们新建一个.babelrc,用来描述babel的配置:

1 { 2     "presets": [ 3         "stage-3", 4         "es2015" 5     ], 6     "plugins": [ 7         [ 8             "transform-runtime", 9             {10                 "polyfill": false,11                 "regenerator": true12             }13         ]14     ]15 }

我们使用babel官方推荐的transform-runtime来进行启动翻译工作,而不是pollify,虽然后者有更多的功能,但是对于不需要的人来说,那是对原生对象的污染和项目性能的负担。

第三步

新建一个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地址:


 

转载于:https://www.cnblogs.com/xidu/p/6110560.html

你可能感兴趣的文章
在Android studio中添加jar包方法如下
查看>>
iframe 在ie下面总是弹出新窗口解决方法
查看>>
分享10款漂亮实用的CSS3按钮
查看>>
安装nginx 常见错误及 解决方法
查看>>
Gorun8电子商城
查看>>
在之前链表的基础上改良的链表
查看>>
android编译系统makefile(Android.mk)写法
查看>>
MD5源代码C++
查看>>
Eclipse 添加 Ibator
查看>>
Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
查看>>
Python编程语言
查看>>
十四、转到 linux
查看>>
Got error 241 'Invalid schema
查看>>
ReferenceError: event is not defined
查看>>
男人要内在美,更要外在美
查看>>
为什么要跟别人比?
查看>>
app启动白屏
查看>>
Oracle 提高查询性能(基础)
查看>>
学习知识应该像织网一样去学习——“网状学习法”
查看>>
Hadoop集群完全分布式安装
查看>>