码迷,mamicode.com
首页 > Web开发 > 详细

nodejs实用学习笔计(转)

时间:2015-06-09 19:43:33      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:

一、使用 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(‘我在这里处理了某些事情...‘);
});

https://github.com/tejasmanohar/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();
});

http://www.nodemailer.com/

 

三、使用 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‘);

https://github.com/cheeriojs/cheerio

 

四、解决 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(‘获取数据出现错误‘);
    });
});

https://github.com/ashtuchkin/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的项目地址:

https://github.com/caolan/async

 

六、使用 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);
            }
        });
    }
});

以上文章转自http://www.zhanxin.info/nodejs/2013-11-04-nodejs-practical-study-notes.html,作者"掌心"

nodejs实用学习笔计(转)

标签:

原文地址:http://www.cnblogs.com/yangzonglong/p/4564101.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!