zoukankan      html  css  js  c++  java
  • 使用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,内容如下:

     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": true
    12             }
    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地址:GitHub Demo


  • 相关阅读:
    2018牛客网暑期ACM多校训练营(第九场)A -Circulant Matrix(FWT)
    ZOJ
    BZOJ 4318 OSU!(概率DP)
    POJ
    POJ
    Linux安装及管理程序
    Linux目录及文件管理
    linux账号管理操作
    linux系统命令总结
    linux目录及文件管理操作
  • 原文地址:https://www.cnblogs.com/xidu/p/6110560.html
Copyright © 2011-2022 走看看