使用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>这样的对象呢,异步调用后的结果是一 ...
随机推荐
- npm stripts 使用指南
Node 开发离不开 npm,而脚本功能是 npm 最强大.最常用的功能之一. 本文介绍如何使用 npm 脚本(npm scripts). 一.什么是 npm 脚本? npm 允许在package.j ...
- Linux安装Scala步骤
1.到官方下载tgz的安装包. http://www.scala-lang.org/download/ 注意:在最下面的Other Resources中 2.下载后将压缩包放在/usr/local目录 ...
- redhat yum替换成CentOS yum 并修改源
wget http://mirrors.163.com/centos/6/os/x86_64/Packages/python-iniparse-0.3.1-2.1.el6.noarch.rpm wge ...
- JMeter学习笔记(四)
1. 断言 断言组件是通过获取服务器响应数据,然后根据断言规则去匹配这些响应数据:匹配到是正常现象,此时我们看不到任何提醒,如果匹配不到,即出现了异常情况,此时JMeter就会断定这个事务失败,那么我 ...
- Spring--初始化IOC容器的几种方式
初始化beanfactory主要有以下的三种方式: 1.filesystemXml Resource resource = new FileSystemResource("beans. ...
- Bootstrap学习笔记(4)--导航栏
相关类: nav, nav-pills, nav-tags, nav-stacked ul里使用,导航格胶囊,方片外观,堆叠外观 navbar, navbar-header, navbar-brand ...
- exit会结束一个进程
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include<stdlib.h ...
- Java中的阻塞队列(BlockingQueue)
1. 什么是阻塞队列 阻塞队列(BlockingQueue)是 Java 5 并发新特性中的内容,阻塞队列的接口是 java.util.concurrent.BlockingQueue,它提供了两个附 ...
- gch文件学习
今晚学习友元函数的时候一点一点的在写一个头文件和一个源文件,中间g++ test.h了一下,无意中就生成了test.h.gch文件.后来修改了头文件的内容,但是不知道为什么一直各种出错,一番折腾之后才 ...
- NameNode机制和DataNode机制
首先我们看一下NAMENODE: 我们已经知道了NAMENODE作为DATANODE的管理者,其重要性不言而喻,那么NAMENODE是怎么管理数据的呢? 首先,我们看一下上面这张图,每次客户端读写数据 ...