标签:
定时任务:在某个时间段,让程序自己来完成一些任务,而不需要人工手动来完成。
恩,例如我要做一个功能,就是每天早上 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
收发邮件可以说是一个很普通的功能,对于我来说,在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(); });
听起来像是写一个「爬虫」,是的。就是利用 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‘);
具体为什么会出现乱码,这里就不作介绍了。很明显,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 的一些特性,例如并发、异步等,都是非常好用的。但在这里,我给自己一个违背规则的需求,就是让这个数组里面的链接一个接一个又顺序地去执行,就像排队一样。以便于我观察数据的进度。
如何实现排队呢?排队的时候如果有异步操作又怎么办呢?唉,真是闲着蛋疼。这跟工作流挺像的。恩,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
这个功能其实很简单,直接调用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,作者"掌心"
标签:
原文地址:http://www.cnblogs.com/yangzonglong/p/4564101.html