nodejs实用学习笔计(转)

一、使用 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: "[email protected]",
        pass: "userpass"
    }
});
//邮件配置,发送一下 unicode 符合的内容试试!
var mailOptions = {
    from: "Fred Foo ? ",       // 发送地址
    to: "[email protected], [email protected]", // 接收列表
    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,作者"掌心"

时间: 2024-08-17 16:08:57

nodejs实用学习笔计(转)的相关文章

go 语言学习笔计之结构体

go 语言中的结构体方法 结构体名称的大小写有着不同的意义: 小写表示不能被别的包访问 package main import "fmt" type Rect struct { width,height int } func (r *Rect) area() int { return r.width*r.height; } func main() { r:=Rect{width:10,height:10} fmt.Println(r.area()); rp:=&r; fmt.P

舌尖上的安卓(android触控事件机制学习笔记录)

对于一个"我们从来不生产代码,我们只是大自然代码的搬运工"的码农来说.对android的触控机制一直是模棱两可的状态,特别是当要求一些自定义的控件和androide的自带控件(比如ViewPager,ListView,ScrollView)高度嵌套在一起使用时. 花了点时间梳理了下,做个笔记.对于一个触控的事件从用户输入到传递到Actigvity到最外层的Viewgroup在到子View,中间过程还可能穿插多个Viewgroup,android在ViewGroup提供了3个方法来控制流

windows下《七天学会NodeJS》学习笔记之二--代码的组织和部署

本系列第一篇:<windows下<七天学会NodeJS>学习笔记之一--NodeJS基础>,请参见这儿:http://blog.csdn.net/fm2005/article/details/41348813 模块路径解析规则:nodejs支持三种解析方式:/或C:开头的绝对路径:./开头的绝对路径:按照一定规则解析路径,直到找到模块位置. 内置模块:如果传递给require的是NodeJS内置模块名称,则不解析,直接返回内部模块导出对象. node_modules目录:node_

android NDK 实用学习-java端对象成员赋值和获取对象成员值

1,关于java端类及接口定义请参考: android NDK 实用学习-获取java端类及其类变量 2,对传过来的参数进行赋值: 对bool类型成员进行赋值  env->SetBooleanField(jobj, jfbdata, false); 对double类型成员进行赋值 env->SetDoubleField(jobj, jfddata, 209.22); 对int类型成员进行赋值 env->SetIntField(jobj, jfidata, 3653); 对byte类型成员

android NDK 实用学习(三)- java端类对象的构造及使用

1,读此文章前我假设你已经读过: android NDK 实用学习-获取java端类及其类变量 android NDK 实用学习-java端对象成员赋值和获取对象成员值 2,java端类对象的构造: ①首先获取类; ②获取类的无参构造函数: jmethodID initID = env->GetMethodID(jcSetDataMgr, "<init>", "()V"); ③构造类实例: jobject jresult = env->New

android NDK 实用学习(五)-c++端调用java接口

1,阅读此文章前请阅读前面文章,以免阅读出现障碍: android NDK 实用学习(一)-获取java端类及其类变量 android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值 android NDK 实用学习(三)- java端类对象的构造及使用 android NDK 实用学习(四)-类缓存 2,java端类接口定义: 1 public class RTKNativeManager { 2 // 其他接口 3 4 // 开给c++端的接口 5 public static

nodejs基础学习1

ES6常用新语法 ES6新语法 什么是ES6? 由于JavaScript是上个世纪90年代,由Brendan Eich在用了10天左右的时间发明的:虽然语言的设计者很牛逼,但是也扛不住"时间紧,任务重".因此,JavaScript在早期有很多的设计缺陷:而它的管理组织为了修复这些缺陷,会定期的给JS添加一些新的语法特性.JavaScript前后更新了很多个版本,我们要学的是ES6这个版本. ES6是JS管理组织在2015年发布的一个版本,这个版本和之前的版本大不一样,包含了大量实用的,

Nodejs+Express学习二(Mongoose基础了解)

原文链接:https://segmentfault.com/a/1190000005783972 学习Node注定少不了与数据库打交道,而MongoDB和Node可以说是绝配,这篇主要是简单介绍Mongoose这个模块.由于本人也是边学边写的这篇文章,绝对会有新手的味道,请大神看到这里就表往下看了. 名词介绍稍微翻阅下mongoose文档就会看到Schema.Model.Entity这几个名词,文章主要围绕这几个词展开,所以有必要解释一下: Schema:一种以文件形式存储的数据库模型骨架,不具

【nodejs】学习笔记

学习链接:http://www.cnblogs.com/zhongweiv/p/nodejs_environment.html (一)简介及环境安装 Node.js是让Javascript脱离浏览器运行在服务器的一个平台,不是语言: Node.js采用的Javascript引擎是来自Google Chrome的V8:运行在浏览器外不用考虑头疼的Javascript兼容性问题 采用单线程.异步IO与事件驱动的设计来实现高并发(异步事件也在一定程度上增加了开发和调试的难度): Node.js内建一个