一些小众却有用的 Node.js 包

做者:Scott Robinson

翻译:疯狂的技术宅javascript

原文:https://stackabuse.com/useful...html

yargs

yargs 是一个用来处理命令行参数的包,能够帮你处理自行设置的命令行标志和输入的任何类型的数据,其中包括布尔值、浮点数和字符串等。这个包很是简单明了,不须要在项目中编写大量的样板代码。前端

yargs 可以帮你处理 “用法帮助” 输出,能够轻松地告诉用户在使用你程序时须要输入哪些选项,包括哪些是必选的。java

var argv = require('yargs')
    .usage('Usage: $0 -x [num] -y [num]')
    .demand(['x','y'])
    .argv;
 
console.log('Pow(x, y):', Math.pow(argv.x, argv.y));

把上面的代码保存为 index.js,而后在命令行中执行 node index.js -x 3,会看到以下消息:node

Usage: index.js -x [num] -y [num]

Options:
  -x                                                                  [required]
  -y                                                                  [required]

Missing required argument: y

yargs 可以提示咱们命令行中到底缺乏什么参数,而咱们只须要简单的调用 .usage().demand() 方法就好了。git

toobusy

这是一个很是实用的包。程序员

它轮询 Node 事件循环并跟踪完成请求所需的时间,若是发现延迟时间太长,则 toobusy 会通知你,而后你就能够将 HTTP 503 "Service Unavailable" 状态码返回给客户端。github

这种处理是很重要的,由于服务器越忙,请求所等待的时间也就越长。这很快就成为一个很复杂的问题,随着时间的流逝会愈来愈严重。若是你听之任之的话,那么服务将会崩溃。若是咱们能及时的中止一些请求的处理,并返回 HTTP 503,这样的话至少还能处理一些请求。面试

能够轻松的用 npm 命令安装 toobusyshell

npm install toobusy

而后把它和相似 Express 的东西集成在一块儿:

var toobusy = require('toobusy'),
    express = require('express');
    
var app = express();
    
// 若是服务器压力过大将会阻止请求
app.use(function(req, res, next) {
    if (toobusy()) {
        res.send(503, "Too many users!");
    } else {
        next();
    } 
});
  
var server = app.listen(3000);
  
process.on('SIGINT', function() {
    server.close();
    toobusy.shutdown();    // 正常退出
    process.exit();
});

不须要写多少代码,也不用太多的配置就能继承到咱们本身的项目中。

chalk

在命令行上很难开发出一个好用的用户界面,由于用于和用户交互的只是命令行窗口。那么你该如何去提示一些重要的信息呢?在输出的文本中添加格式不失为一种好方法。Express 就是一个很典型的例子,从它的输出中,你能够很轻松地快读找到重要的信息。

如下是 chalk 支持的样式列表:

修饰符

  • bold
  • underline
  • dim
  • reset
  • hidden
  • inverse
  • italic (并不是全部环境都支持)
  • strikethrough (任何环境下都不支持)

颜色

  • red
  • black
  • green
  • white
  • yellow
  • blue (在 Windows 上会使用较亮的版本,由于普通的蓝色很难辨认)
  • cyan
  • gray
  • magenta

背景颜色

  • bgBlue
  • bgBlack
  • bgRed
  • bgGreen
  • bgCyan
  • bgYellow
  • bgWhite
  • bgMagenta

虽然官方只支持这些颜色,可是任何符合 xterm 标准的终端均可以使用完整的 8 位色代码。

只须要将字符串传给用于着色或格式化的函数就能轻松的格式化这些文本。若是你须要让用户注意到严重错误提示,能够用下面的格式:

var chalk = require('chalk');

var str = chalk.red.bold('ERROR: ') + chalk.bold('Everything just blew up...');
console.log(str);

node-inspector

好用的调试器很难找,尤为是那些带有好用的 GUI 的调试器,node-inspector 为你提供了一个网页 GUI 来帮助调试代码。它有标准调试器的全部功能,例如断点、单步执行、退出代码以及变量检查等,另外还有一些不太经常使用的功能,可是这些功能很是有用,例如 CPU 和堆分析、网络客户端请求检查以及实时编辑运行代码的功能。

node-inspector

不过 Node Inspector 只与 Chrome 和 Opera 兼容,由于它使用了Blink Developer Tools,并与Node兼容。

一直以来我很是依赖控制台输出进行调试,这会花费了大量的时间。使用 GUI 可以大大的节省调试时间。

terminal-kit

若是你的 Node 程序须要在命令行下支持除简单的文本输入输出以外的其余操做,那么你应该须要 terminal-kit。 terminal-kit 简化了与用户交互的许多东西,使你能够专一于在程序中开发重要的内容。terminal-kit 的主要功能是:

  • 文字样式(很像 chalk
  • 编辑屏幕
  • 进度条
  • 用户输入

有不少适合终端工具包的例子。例如,若是你须要从网上下载一些内容,那么就须要向用户显示进度条。下面的代码用来显示虚拟进度条:

var terminal = require( 'terminal-kit' ).terminal;

var progressBar;
var progress = 0;

function updateProgress() {
    // 产生一个随机的进度值
    progress += Math.random() / 10;
    progressBar.update(progress);
    
    // 检查是否完成
    if (progress >= 1) {
        setTimeout(function() {
            terminal('\n');
            process.exit();
        }, 250);
    }
    else {
        setTimeout(updateProgress, 100 + Math.random() * 500);
    }
}

progressBar = terminal.progressBar({
    width: 80,
    title: 'Downloading file:',
    eta: true,
    percent: true
});

updateProgress();

上面的代码会产生下面这种效果:

terminal-kit进度栏

validator

validator 能够帮你进行一系列常见的字符串验证(例如:电子邮件地址、电话号码、IP地址等)。每当你从用户那里得到输入时,这样的软件包都是必不可少的。用户会犯错误,并会在文本框中输入一些很是奇怪的东西,因此须要一个验证输入的包,避免数据损坏或服务器崩溃。

如下是一些经常使用的验证器:

  • isEmail(str [, options])
  • isIP(str [, version])
  • isMobilePhone(str, locale)
  • isURL(str [, options])

validator 也提供检测器,能够对输入字符串进行规范化、删除或转义。例如对用户提交的内容进行清理,避免他们输入恶意的 HTML 或 JavaScript 代码。

下面是经常使用的检测器:

  • blacklist(input, chars)
  • escape(input)
  • normalizeEmail(email [, options])
  • whitelist(input, chars)

    normalizeEmail() 方法它可以确保电子邮件地址都是小写字母,甚至能够删除须要忽略的字符。假设你有电子邮件 abc.def+ghi@163.comnormalizeEmail() 会将其标准化为 abcdefghi@163.com

formidable

formidable 能够帮你处理文件上传的每一个步骤,包括 multi-part 解析器、把文件写入磁盘以及错误处理等。这是我最喜欢的一个包,若是你不想从新发明轮子能够试一试。

下面是一个在普通 HTTP 服务器上使用 formidable 的例子,代码是从包自己中给出的示例修改而来的:

var http = require('http');
var util = require('util');
var formidable = require('formidable');
var path = require('path');

var PORT = 8080;

var root = path.join(__dirname, '../');
exports.dir = {
    root    : root,
    lib     : root + '/lib',
    fixture : root + '/test/fixture',
    tmp     : root + '/test/tmp',
};

var server = http.createServer(function(req, res) {
  if (req.url == '/') {
    res.writeHead(200, {'content-type': 'text/html'});
    res.end(
      '<form action="/post" method="post">' +
      '<input type="text" name="title"><br>' +
      '<input type="text" name="data[foo][]"><br>' +
      '<input type="submit" value="Submit">' +
      '</form>'
    );
  } else if (req.url == '/post') {
    var form = new formidable.IncomingForm(),
        fields = [];

    form
      .on('error', function(err) {
        res.writeHead(200, {'content-type': 'text/plain'});
        res.end('error:\n\n' + util.inspect(err));
      })
      .on('field', function(field, value) {
        console.log(field, value);
        fields.push([field, value]);
      })
      .on('end', function() {
        console.log('-> post done');
        res.writeHead(200, {'content-type': 'text/plain'});
        res.end('received fields:\n\n ' + util.inspect(fields));
      });
    form.parse(req);
  } else {
    res.writeHead(404, {'content-type': 'text/plain'});
    res.end('404');
  }
});

server.listen(PORT);

console.log('listening on http://localhost:' + PORT + '/');

shelljs

shelljs是一个可以让你在任何系统上使用通用的Unix命令的包,不论是 Windows、Linux 仍是 Mac。这样你就不用再为项目分别编写 bash 和批处理脚本。 shelljs 提供了相似 Unix 的环境,若是你须要编写脚原本运行测试、提交代码或在服务器上启动,则只需编写一次便可。

能够用命令执行相似操做:

require('shelljs/global');

ls('*.js').forEach(function(file) {
    sed('-i', 'BUILD_VERSION', 'v2.0.3', file);
    sed('-i', /.*REMOVE_THIS_LINE.*\n/, '', file);
    sed('-i', /.*REPLACE_THIS_LINE.*\n/, cat('macro.js'), file);
});

执行常见命令:

require('shelljs/global');

mkdir('-p', 'release/data');
cp('-R', 'data/*', 'release/data');

检查可用的二进制文件:

require('shelljs/global');

if (!which('git')) {
    echo('This script requires git!');
    exit(1);
}

甚至能够像在 bash 脚本中同样运行命令:

if (exec('git commit -am "Release commit"').code !== 0) {
  echo('Error: Git commit failed!');
  exit(1);
}

你还知道有哪些好用的包?请在评论留言。

173382ede7319973.gif


本文首发微信公众号:前端先锋

欢迎扫描二维码关注公众号,天天都给你推送新鲜的前端技术文章

欢迎扫描二维码关注公众号,天天都给你推送新鲜的前端技术文章

欢迎继续阅读本专栏其它高赞文章: