nodeJS 实用学习笔记

HomeNodejsnodeJS 实用学习笔记

最近折腾着 nodeJS,用其构建一个系统,十分省事而且快速。由于经验和积累不足,难免遇到问题,后来完成任务了,现在做下笔记与你分享,欢迎交流哦!

说是笔记,其实也就是一些工具的介绍。大部分所需要的工具,都可以在npmjs.org中找到。感谢那些无私奉献的同志们!


一、使用 nodeJS 完成定时任务

定时任务:在某个时间段,让程序自己来完成一些任务,而不需要人工手动来完成。

恩,例如我要做一个功能,就是每天早上 8 点钟给我的客户发送一篇系统日志的邮件。那么,这个时候就需要一个定时任务器了。

后来找了一下,发现node-schedule还不错。很简单地帮我完成工作:

//引进 node-schedule
var schedule = require('node-schedule');
//初始化并设置定时任务的时间
var rule = new schedule.RecurrenceRule();
rule.minute = 42;
//处理要做的事情
var j = schedule.scheduleJob(rule, function(){
    console.log('我在这里处理了某些事情...');
});

项目的地址在下面,文档中有更多的 API 介绍可供实用:

node-schedule


二、使用 nodeJS 发送邮件

收发邮件可以说是一个很普通的功能,对于我来说,在php,或者java中实现起来,颇为困难。不过,在 nodeJS 中,就显得太简单了。

很常用的一个组件Nodemailer,可以轻松地帮我实现功能:

var nodemailer = require("nodemailer");
//这里是初始化,需要定义发送的协议,还有你的服务邮箱,当然包括密码了
var smtpTransport = nodemailer.createTransport("SMTP",{
    service: "Gmail",
    auth: {
        user: "gmail.user@gmail.com",
        pass: "userpass"
    }
});
//邮件配置,发送一下 unicode 符合的内容试试!
var mailOptions = {
    from: "Fred Foo ✔ ",       // 发送地址
    to: "bar@blurdybloop.com, baz@blurdybloop.com", // 接收列表
    subject: "Hello ✔",                             // 邮件主题
    text: "Hello world ✔",                          // 文本内容
    html: "Hello world ✔"                    // html内容
}
//开始发送邮件
smtpTransport.sendMail(mailOptions, function(error, response){
    if(error){
        console.log(error);
    }else{
        console.log("邮件已经发送: " + response.message);
    }
    //如果还需要实用其他的 smtp 协议,可将当前回话关闭
    //smtpTransport.close();
});

Nodemailer的主页如下:

Nodemailer

PS: 使用如上 2 个组件,我就可以轻松实现定时发送邮件的功能了。恩,其实我要求蛮低的。


三、使用 nodeJS 爬取网页数据

听起来像是写一个「爬虫」,是的。就是利用 nodeJS 来抓取一个网页,从而获得并筛选有价值的内容;然后继续去爬取更多的网页,如此循环并反馈回来。

简单的思考一下如何去做,可以分为 2 步:

  • 通过「get」请求,抓取网页源码到本地服务器;
var http =  require('http');
var url = "http://www.baidu.com";
http.get(url, function(res) {
    var source = "";
    //通过 get 请求获取网页代码 source
    res.on('data', function(data) {
        source += data;
    });
    //获取到数据 source,我们可以对数据进行操作了!
    res.on('end', function() {
        console.log(source);
        //这将输出很多的 html 代码
    });
}).on('error', function() {
    console.log("获取数据出现错误");
});
  • 分析源码,筛选有价值的内容。如何在服务器端解析「HTML」代码呢?简单而又方便,特别是操作习惯,我推荐使用cheerio
var cheerio = require('cheerio'),
//这里可以定义我们刚刚从上面抓取到的 source
//source 其实是 <html>...</html> 的片段
$ = cheerio.load(source);
//我们就可以像操作 jQuery 一样操作服务器端抓回来的数据了
$('h2.title').text('Hello there!');
$('h2').addClass('welcome');

cheerio的主页地址如下:

cheerio

PS:这样就能抓取到我们想要的数据么?非也,假如我们抓取的是一个 GBK 编码的页面,估计就悲剧了。


四、解决 nodeJS 抓取 GBK 编码数据乱码

具体为什么会出现乱码,这里就不作介绍了。很明显,nodeJS支持的是 UTF8,而我们抓到的数据是 GBK,当然就乱了。这时候,就需要个中间人来转换一下。

恩,iconv-lite可以帮助我们完成任务:

var http =  require('http')
var iconv = require('iconv-lite');
var url = 'http://www.taobao.com';
//假设我们抓取的是 GBK 编码的内容,这时候就需要转码了
http.get(url, function(res){
    res.setEncoding('binary');
    var source = "";
    res.on('data', function(data) {
        source += data;
    });
    res.on('end', function() {
        var buf = new Buffer(source, 'binary');
        var str = iconv.decode(buf, 'GBK');
        console.log(str);
        //这里输出的内容就不会有乱码了
    }).on("error", function() {
        logger.error('获取数据出现错误');
    });
});

同样,这里会有iconv-lite的项目地址,更多的介绍和使用方法:

iconv-lite


五、使用 nodeJS 让一个「数据数组」排队完成任务

我从上述抓取到的内容中,通过这个简单的「爬虫」获取到了很多有意义的链接地址。于是,我将它们存放到一个数组里面。接下来的工作,就是要遍历这个数据里面的连接地址,再次去抓取有意义的网页过来。

nodeJS 的一些特性,例如并发、异步等,都是非常好用的。但在这里,我给自己一个违背规则的需求,就是让这个数组里面的链接一个接一个又顺序地去执行,就像排队一样。以便于我观察数据的进度。

如何实现排队呢?排队的时候如果有异步操作又怎么办呢?唉,真是闲着蛋疼。这跟工作流挺像的。恩,Async.js完全胜任。

var async = require('async');
//定义的源数据
var dataArr = ['1', '2', '3', '4'];
//假设我就是要执行每一个排队加1的操作
//我这里使用的是async的forEachSeries方法
async.forEachSeries(dataArr, function(item, callback) {
    console.log('输出数据:' + item);
    setTimeout(function(){
        console.log('异步调用的内容,再输出: ' + item + 1);
        callback(null, item);
    }, item.delay);
}, function(err) {
    console.log('完毕,是否有错误:' + err);
});
//运行之后,输出的数据会是下面这样:
//
//输出数据:1
//异步调用的内容,再输出: 11
//输出数据: 2
//异步调用的内容,再输出: 21
//输出数据: 3
//异步调用的内容,再输出: 31
//输出数据: 4
//异步调用的内容,再输出: 41
//完毕,是否有错误:null

恩,再次感叹 nodeJS 的强大,还有社区的贡献。下面是Async.js的项目地址:

Async.js


六、使用 nodeJS 创建文件和写文件

这个功能其实很简单,直接调用fs的功能就好。参见File System的 API 文档。

var fs = require('fs');
//新建 hello.txt ,并往文件中写入 Hello World!
fs.open('hello.txt', 'w', 0666, function(e, fd) {
    if(e) {
        console.log('错误信息:' + e);
    } else {
        fs.write(fd, 'Hello World!', 0, 'utf8', function(e) {
            if(e) {
                console.log('出错信息:' + e);
            } else {
                fs.closeSync(fd);
            }
        });
    }
});

从上到下的这几个示例,你就可以完成一项简单的任务了。在服务器端定时地去抓取内容,并写入文件,完成的时候发送邮件告诉自己。

恩,nodeJS 完成起来真棒!-- By 掌心

  • 作者「」于 更新本文
  • 文章声明:自由转载-非商用-非衍生-保持署名 | BY-NC-SA
← Jekyll 数据文件 网站品牌设计从「登录」开始→
  • 获取每日の能量源
  • ATP