使用async/await——Nodejs+ExpressJs+Babel
在使用诸如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,内容如下:
{
"name": "express_babel_demo2",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"babel-core": "^6.18.2",
"babel-preset-es2015": "^6.18.0",
"babel-preset-stage-3": "^6.17.0",
"babel-runtime": "^6.18.0",
"bluebird": "^3.4.6",
"express": "^4.14.0"
},
"devDependencies": {
"babel-plugin-transform-runtime": "^6.15.0"
}
}
可以看到,在我们的依赖中,已经存在babel-core等组件,bluebird是我最喜欢的一个Promise A+实现,性能也是真男人。
第二步
然后我们新建一个.babelrc,用来描述babel的配置:
{
"presets": [
"stage-3",
"es2015"
],
"plugins": [
[
"transform-runtime",
{
"polyfill": false,
"regenerator": true
}
]
]
}
我们使用babel官方推荐的transform-runtime来进行启动翻译工作,而不是pollify,虽然后者有更多的功能,但是对于不需要的人来说,那是对原生对象的污染和项目性能的负担。
第三步
新建一个index.js文件,这个是demo的启动文件,代码依旧简单,引入babel、babel翻译和expressjs的入口:
require('babel-core/register');
require('./app.js');
require("babel-core").transform("code", {
plugins: ["transform-runtime"]
});
第四步
编写一个app.js,使用原生fs库异步读取一下package.json文件并输出:
var express = require('express');
var app = express();
var fs = require('fs');
var Promise = require('bluebird');
app.get('/', function (req, res) {
testAsync();
res.send('Hello World!');
});
var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://%s:%s', host, port);
});
async function testAsync(name) {
console.log("hello");
for (let i = 0; i < 3; i++) {
let fileContent = await readFile("package.json");
console.log(new Buffer(fileContent).toString());
console.log(".");
}
console.log(name);
}
let readFile = Promise.promisify(fs.readFile);
然后执行一下npm install,会下载依赖
再node index.js启动我们所编写的express demo。
浏览器访问localhost:3000,在控台里就能看到“异步读取、同步输出”的内容了。
demo github地址:GitHub Demo
使用async/await——Nodejs+ExpressJs+Babel的更多相关文章
- [原创.数据可视化系列之十二]使用 nodejs通过async await建立同步数据抓取
做数据分析和可视化工作,最重要的一点就是数据抓取工作,之前使用Java和python都做过简单的数据抓取,感觉用的很不顺手. 后来用nodejs发现非常不错,通过js就可以进行数据抓取工作,类似jqu ...
- async/await与promise(nodejs中的异步操作问题)
此文只是粗略介绍使用方法,欲了解核心概念请参考官方文档或其他资料. 举例写文章详情页面的时候的一个场景:首先更改文章详情中的 PV,然后读取文章详情,然后根据文章详情中文章 Id 查阅该文章评论和该文 ...
- [转] 以 async/await 为例,说明 babel 插件怎么搭
你一定碰到过这些库 babel-polyfill 项目地址:https://github.com/babel/babel/blob/master/packages/babel-polyfill 通过两 ...
- async/await工作机制探究--NodeJS
ES6中的async/await让Promise变得更加简便,通常await处理的链式Promise会包裹在函数中,返回结果仍然是一个Promise对象. 但是当await直接处理链式Promise时 ...
- NodeJs通过async/await处理异步
##场景 远古时代 我们在编写express后台,经常要有许多异步IO的处理.在远古时代,我们都是用chunk函数处理,也就是我们最熟悉的那种默认第一个参数是error的函数.我们来模拟一个Mongo ...
- async和await的返回值——NodeJS, get return value from async await
在ES6和ES5中promise的执行也有不同点(上述提到,ES6中promise属microtask:在ES5中,暂未接触到有api直接操作microtask的,所以.then的异步是用setTim ...
- ES6入门十一:Generator生成器、async+await、Promisify
生成器的基本使用 生成器 + Promise async+await Promise化之Promisify工具方法 一.生成器的基本使用 在介绍生成器的使用之前,可以简单理解生成器实质上生成的就是一个 ...
- 图与例解读Async/Await
JavaScript ES7的async/await语法让异步promise操作起来更方便.如果你需要从多个数据库或者接口按顺序异步获取数据,你可能最终写出一坨纠缠不清的promise与回调.然而使用 ...
- [转] Understanding JavaScript’s async await
PS:Promise的用处是异步调用,这个对象使用的时候,call then函数,传一个处理函数进去,处理异步调用后的结果 Promise<Action>这样的对象呢,异步调用后的结果是一 ...
随机推荐
- 变动性算法源代码分析与使用示例(copy_backward、 transform、 replace_copy_if 等)
首先回顾前面的文章,我们把for_each 归类为非变动性算法,实际上它也可以算是变动性算法,取决于传入的第三个参数,即函数 指针.如果在函数内对容器元素做了修改,那么就属于变动性算法. 变动性算法源 ...
- JS和JSP的差别
近期非常多同学在纠结于名词缩写之间的相似性.因此本人也来写一篇,讲讲JS和JSP的差别. SUN首先发展出SERVLET,其功能比較强劲,体系设计也非常先进,仅仅是,它输出HTML语句还是採用了老的C ...
- ecshop的数据库getRow、getAll、getOne区别
ECShop没有使用一些开源的数据库操作类,比如adodb或者PEAR,而是封装了自己的实现.这样做的好处是实现非常轻量,大大减小了分发包的文件大小.另外,当网站需要做memcached缓存时,也可以 ...
- jqury插件编写
sae中短信验证码: ; (function($) { $(document).ready(function() { if (parent && parent.location.hre ...
- Machine Learning—The k-means clustering algorithm
印象笔记同步分享:Machine Learning-The k-means clustering algorithm
- 远程登录linux上的mysql数据库
UPDATE user SET `Host` = '%' WHERE `User` = 'root' LIMIT 1; 讲root账户,的HOST设置为%,允许所有公网IP访问. flush priv ...
- shell学习笔记之命令(四)
命令的类型:1>.外部命令:在命令提示符中执行的普通命令.2>.内置命令:内置命令是在shell内部实现的. 1.break命令 #!/bin/sh rm -rf fred* echo & ...
- 基于jdom 的 xmluti
package cn.com.do1.wechat.common; import org.jdom.Attribute; import org.jdom.Document; import org.jd ...
- Odoo 8.0 new API 之model 装饰
model装饰器的作用是返回一个集合列表 应用举例: 定义columns langs = fields.Selection(string="Lang",selection=&quo ...
- Groovy学习()Groovy是啥?
Groovy是啥? groovy是英文中的一个单词,有marvelous.wonderful和excellen的意思. groovy是轻量级的,动态的,面向对象的,并且运行在JVM上的. groovy ...