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


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();
上面的代码会产生下面这种效果:
一些小众却有用的 Node.js 包

文章插图
 
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.com,normalizeEmail() 会将其标准化为 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=https://www.isolves.com/it/cxkf/yy/js/2020-10-10/"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:nn' + 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:nn ' + util.inspect(fields));
});
form.parse(req);
} else {
res.writeHead(404, {'content-type': 'text/plain'});
res.end('404');
}


推荐阅读