干货 | Node.js有用的功能组件

1.数据库操作

1.1 mongoose

mongoose是一款Node.js便捷操作MongoDB的对象模型工具。

mongoose

安装

npm install mongoose

简单使用(摘自官网)

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

var Cat = mongoose.model('Cat', { name: String });

var kitty = new Cat({ name: 'Zildjian' });
kitty.save(function (err) {
  if (err) {
    console.log(err);
  } else {
    console.log('meow');
  }
});

注意:需要先运行 MongoDB 服务


官网资料

MongoDB: https://www.mongodb.com/
Mongoose: http://mongoosejs.com/


关于如何使用MongoDB和Mongoose,欢迎阅读我的文章:

MongoDB基础0——MongoDB的安装与可视化管理工具
MongoDB基础1——数据库基本操作
MongoDB基础2——Mongoose的操作指南
MongoDB基础3——Mongoose的数据交互问题
MongoDB基础4——安全与身份认证
MongoDB基础X——踩过的坑以及解决方案(持续更新中)


1.2 redis

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

资料来源 - Redis 中文官网: http://www.redis.cn/


这里所说的redis是Node.js对redis数据库进行操作的一个中间件。


安装

npm install redis --save

简单使用(摘自官网)

var redis = require("redis"),
    client = redis.createClient();

// if you'd like to select database 3, instead of 0 (default), call
// client.select(3, function() { /* ... */ });

client.on("error", function (err) {
    console.log("Error " + err);
});

client.set("string key", "string val", redis.print);
client.hset("hash key", "hashtest 1", "some value", redis.print);
client.hset(["hash key", "hashtest 2", "some other value"], redis.print);
client.hkeys("hash key", function (err, replies) {
    console.log(replies.length + " replies:");
    replies.forEach(function (reply, i) {
        console.log("    " + i + ": " + reply);
    });
    client.quit();
});

github: https://github.com/NodeRedis/node_redis
npm: https://www.npmjs.com/package/redis


关于redis在Node.js中的应用,可阅读我的文章:
《Node.js的Redis简单例子》


1.2 mysql

A pure node.js JavaScript Client implementing the MySql protocol.


安装

npm install mysql

简单使用(摘自官网)

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'me',
  password : 'secret',
  database : 'my_db'
});

connection.connect();

connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
  if (error) throw error;
  console.log('The solution is: ', results[0].solution);
});

connection.end();

Github地址: https://github.com/mysqljs/mysql


2.网络

2.1 http-proxy

安装

npm install http-proxy --save

简单使用(摘自官网)

var http = require('http'),
    httpProxy = require('http-proxy');

//
// Create a proxy server with custom application logic
//
var proxy = httpProxy.createProxyServer({});

//
// Create your custom server and just call `proxy.web()` to proxy
// a web request to the target passed in the options
// also you can use `proxy.ws()` to proxy a websockets request
//
var server = http.createServer(function(req, res) {
  // You can define here your custom logic to handle the request
  // and then proxy the request.
  proxy.web(req, res, { target: 'http://127.0.0.1:5060' });
});

console.log("listening on port 5050")
server.listen(5050);

github: https://github.com/nodejitsu/node-http-proxy


欢迎阅读我的文章:
《http-proxy反向代理以调度服务器各app》


2.2 request

request是node.js的一个中间件,用它可以通过服务器请求url并返回数据。

request可以作为Node.js爬虫爬取网络资源的工具,也可以使用它来实现oAuth登录。

更多资料,可参考:《Request —— 让 Node.js http请求变得超简单》


安装

npm install request --save

简单使用(摘自官网)

var request = require('request');
request('http://www.google.com', function (error, response, body) {
  console.log('error:', error); // Print the error if one occurred
  console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
  console.log('body:', body); // Print the HTML for the Google homepage.
});

Github:https://github.com/request/request


2.3 cheerio

像jQuery操作网页一样在服务端操作抓取的网页数据:Fast, flexible & lean implementation of core jQuery designed specifically for the server.


安装

npm install cheerio --save

简单使用(摘自官网)

const cheerio = require('cheerio')
const $ = cheerio.load('<h2 class="title">Hello world</h2>')

$('h2.title').text('Hello there!')
$('h2').addClass('welcome')

$.html()
//=> <h2 class="title welcome">Hello there!</h2>

request的应用:
Node.js通过微信网页授权机制获取用户信息
卫星信息抓取工具SatCapturer


Github:https://github.com/cheeriojs/cheerio


3.发送邮件

3.1 Nodemailer

Nodemailer

Nodemailer 是一款Node.js用于发送邮件的中间件,您可以使用自己的邮箱帐户和密码,通过此中间件来发送邮件。

Nodemailer支持批量发送给多个邮箱,支持抄送和密送;此外,它还支持发送带附件的邮件。

Nodemailer遵循MIT许可,您可以将它作为网站服务邮箱的发送引擎,用于推送网站服务信息。

关于Nodemailer的许可:License


安装

npm install nodemailer --save

使用(来自官网)

'use strict';
const nodemailer = require('nodemailer');

// create reusable transporter object using the default SMTP transport
let transporter = nodemailer.createTransport({
    host: 'smtp.example.com',
    port: 465,
    secure: true, // secure:true for port 465, secure:false for port 587
    auth: {
        user: 'username@example.com',
        pass: 'userpass'
    }
});

// setup email data with unicode symbols
let mailOptions = {
    from: '"Fred Foo 👻" <foo@blurdybloop.com>', // sender address
    to: 'bar@blurdybloop.com, baz@blurdybloop.com', // list of receivers
    subject: 'Hello ✔', // Subject line
    text: 'Hello world ?', // plain text body
    html: '<b>Hello world ?</b>' // html body
};

// send mail with defined transport object
transporter.sendMail(mailOptions, (error, info) => {
    if (error) {
        return console.log(error);
    }
    console.log('Message %s sent: %s', info.messageId, info.response);
});

其使用案例可以参考我的一篇文章:
《Node.js使用NodeMailer发送邮件》

地址:Nodemailer


4.视频处理

4.1 ffmpeg

ffmpeg

首先,FFmpeg是一款跨平台的全功能音视频处理解决方案。

它可以对音视频进行录制、转码(h.264、mpeg4、AAC等)、切割,可以将其封装为不同格式(m3u8、mp4、stream等)。

FFmpeg可以安装在Linux、MacOS和Windows中。


fluent-ffmpeg 是基于FFmpeg的一款Node.js中间件。它的所有功能都是以FFmpeg为基础的,因此使用前必须先安装FFmpeg。

fluent-ffmpeg将FFmpeg的命令转换为"fluent",和链式调用一样,让node.js程序更好地调用FFmpeg命令。


篇幅所限,关于 FFmpegfluent-ffmpeg 的安装和使用案例的详细内容,欢迎阅读我的另一篇文章:
《Node.js调用FFmpeg对视频进行切片》


安装

npm install fluent-ffmpeg

简单使用(摘自官方github页面):

var ffmpeg = require('fluent-ffmpeg');

ffmpeg()
  .input('/dev/video0')
  .inputFormat('mov')
  .input('/path/to/file.avi')
  .inputFormat('avi');

地址:fluent-ffmpeg


5.压缩文件(夹)

5.1 archiver

archiver是一款node.js的打包文件、文件夹的工具,它可以打包单个文件、子文件夹下所有文件、字符串、buffer等类型数据到一个zip包里。


安装

npm install archiver --save

简单使用(摘自官网)

// require modules
var fs = require('fs');
var archiver = require('archiver');

// create a file to stream archive data to.
var output = fs.createWriteStream(__dirname + '/example.zip');
var archive = archiver('zip', {
    zlib: { level: 9 } // Sets the compression level.
});

// listen for all archive data to be written
output.on('close', function() {
  console.log(archive.pointer() + ' total bytes');
  console.log('archiver has been finalized and the output file descriptor has closed.');
});

// good practice to catch warnings (ie stat failures and other non-blocking errors)
archive.on('warning', function(err) {
  if (err.code === 'ENOENT') {
      // log warning
  } else {
      // throw error
      throw err;
  }
});

// good practice to catch this error explicitly
archive.on('error', function(err) {
  throw err;
});

// pipe archive data to the file
archive.pipe(output);

// append a file from stream
var file1 = __dirname + '/file1.txt';
archive.append(fs.createReadStream(file1), { name: 'file1.txt' });

// append a file from string
archive.append('string cheese!', { name: 'file2.txt' });

// append a file from buffer
var buffer3 = Buffer.from('buff it!');
archive.append(buffer3, { name: 'file3.txt' });

// append a file
archive.file('file1.txt', { name: 'file4.txt' });

// append files from a sub-directory and naming it `new-subdir` within the archive
archive.directory('subdir/', 'new-subdir');

// append files from a sub-directory, putting its contents at the root of archive
archive.directory('subdir/', false);

// append files from a glob pattern
archive.glob('subdir/*.txt');

// finalize the archive (ie we are done appending files but streams have to finish yet)
archive.finalize();

官网:https://archiverjs.com/docs/#quick-start


6.管理工具

6.1 pm2

启动的应用

pm2是一款管理node.js应用的工具。它可以让你的node应用运行在后台,随时查看每个应用的状态(占用资源、重启次数、持续时长、CPU使用、打印等)。

此外,pm2还支持自动重启:当你的node应用代码有更新后,自动重启服务。这个适用于调试的时候。


安装

npm install pm2 -g

注意这里要加上 -g,表示此工具要安装到全局命令中。Linux系统可能还要手动操作添加链接。


相关使用帮助可阅读:
《用pm2管理node.js应用》


6.2 Supervisor

相比较pm2,Supervisor似乎看起来更适合用于调试代码,便捷的启动方式、监控代码变化自动重启服务都为我们开发量身定做。


安装

npm install supervisor -g

注意这里要加上 -g,表示此工具要安装到全局命令中。Linux系统可能还要手动操作添加链接。


7.加密、签名和校验

7.1 crypto

https://nodejs.org/api/crypto.html

相关资料:RSA签名与验证


相关使用帮助可阅读:
《详细版 | 用Supervisor守护你的Node.js进程》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容