1.
formidable |
1) 创建Formidable.IncomingForm对象
var form = new formidable.IncomingForm()
2) form.encoding = 'utf-8' 设置表单域的编码
3) form.uploadDir = "/my/dir"; 设置上传文件存放的文件夹,默认为系统的临时文件夹,可以使用fs.rename()来改变上传文件的存放位置和文件名
4) form.keepExtensions = false; 设置该属性为true可以使得上传的文件保持原来的文件的扩展名。
5) form.type 只读,根据请求的类型,取值'multipart' or 'urlencoded'
6) form.maxFieldsSize = 2 * 1024 * 1024; 限制所有存储表单字段域的大小(除去file字段),如果超出,则会触发error事件,默认为2M
7) form.maxFields = 1000 设置可以转换多少查询字符串,默认为1000
8) form.hash = false; 设置上传文件的检验码,可以有两个取值'sha1' or 'md5'.
9) form.multiples = false; 开启该功能,当调用form.parse()方法时,回调函数的files参数将会是一个file数组,数组每一个成员是一个File对象,此功能需要 html5中multiple特性支持。
10) form.bytesReceived 返回服务器已经接收到当前表单数据多少字节
11) form.bytesExpected 返回将要接收到当前表单所有数据的大小
12) form.parse(request, [callback]) 该方法会转换请求中所包含的表单数据,callback会包含所有字段域和文件信息,如:
form.parse(req, function(err, fields, files) {
// ...
});
13) form.onPart(part); 你可以重载处理multipart流的方法,这样做的话会禁止field和file事件的发生,你将不得不自己处理这些事情,如:
form.onPart = function(part) {
part.addListener('data', function() {
// ...
});
}
如果你只想让formdable处理一部分事情,你可以这样做:
form.onPart = function(part) {
if (!part.filename) {
// 让formidable处理所有非文件部分
form.handlePart(part);
}
}
14) formidable.File对象
A. file.size = 0 上传文件的大小,如果文件正在上传,表示已上传部分的大小
B. file.path = null 上传文件的路径。如果不想让formidable产生一个临时文件夹,可以在fileBegain事件中修改路径
C. file.name = null 上传文件的名字
D. file.type = null 上传文件的mime类型
E. file.lastModifiedDate = null 时间对象,上传文件最近一次被修改的时间
F. file.hash = null 返回文件的hash值
G. 可以使用JSON.stringify(file.toJSON())来格式化输出文件的信息
15) form.on('progress', function(bytesReceived, bytesExpected) {}); 当有数据块被处理之后会触发该事件,对于创建进度条非常有用。
16) form.on('field', function(name, value) {}); 每当一个字段/值对已经收到时会触发该事件
17) form.on('fileBegin', function(name, file) {}); 在post流中检测到任意一个新的文件便会触发该事件
18) form.on('file', function(name, file) {}); 每当有一对字段/文件已经接收到,便会触发该事件
19) form.on('error', function(err) {}); 当上传流中出现错误便会触发该事件,当出现错误时,若想要继续触发request的data事件,则必须手动调用request.resume()方法
20) form.on('aborted', function() {}); 当用户中止请求时会触发该事件,socket中的timeout和close事件也会触发该事件,当该事件触发之后,error事件也会触发
21) form.on('end', function() {}); 当所有的请求已经接收到,并且所有的文件都已上传到服务器中,该事件会触发。此时可以发送请求到客户端。
2.
cheerio可以理解成node.js版的jquery
cheerio是一个node的库,可以理解为一个Node.js版本的jquery,用来从网页中以 css selector取数据,使用方式和jquery基本相同。
npm install cheerio --save
var cheerio = require('cheerio')
var $ = cheerio.load('<h2 class="title">Hello world</h2>')
$('h2.title').text('Hello there!')
$('h2').addClass('welcome')
$.html()
//=> <h2 class="title welcome">Hello there!</h2>
npm install cheerio --save
var cheerio = require('cheerio')
var $ = cheerio.load('<h2 class="title">Hello world</h2>')
$('h2.title').text('Hello there!')
$('h2').addClass('welcome')
$.html()
//=> <h2 class="title welcome">Hello there!</h2>
可以看出Cheerio 与jquery拥有相似的语法。事实上,Cheerio 从jQuery库中去除了所有 DOM不一致性和浏览器尴尬的部分,性能更优。首先你需要加载HTML。这一步对jQuery来说是必须的,通过Cheerio,我们需要把HTML document 传进去,下面的代码都针对如下代码
var html = '<ul id="fruits"> <li class="apple">Apple</li> <li class="orange">Orange</li> <li class="pear">Pear</li> </ul>'
//DOM结构如下
<ul id="fruits">
<li class="apple">Apple</li>
<li class="orange">Orange</li>
<li class="pear">Pear</li>
</ul>
var cheerio = require('cheerio'),
$ = cheerio.load(html);
$(selectior,[context],[root])
选择器在 Context 范围内搜索,Context又在Root范围内搜索。注意:这里是root在右,context在左。selector 和context可以是一个字符串表达式,DOM元素,和DOM元素的数组,或者chreeio对象。root 是通常是HTML 文档字符串。
$('.apple', '#fruits').text()
//=> Apple
//id为fruits,class为apple的元素,先root后context
$('ul .pear').attr('class')
//=> pear
//class为pear的ul元素
$('li[class=orange]').html()
//=> Orange
//class属性为orange的li元素
attr()修改属性
attr(name,value)
获得和修改属性。在匹配的元素中只能获得第一元素的属性。如果设置一个属性的值为null,则移除这个属性。你也可以传递一对键值,或者一个函数。
$('ul').attr('id')
//=> fruits
$('.apple').attr('id', 'favorite').html()
//=> <li class="apple" id="favorite">Apple</li>
$('.apple').attr('class', 'favorite').html()
//=> <li class="favorite">Apple</li>
removeAttr(name)
通过name删除属性
$('.pear').removeAttr('class').html()
//=> pear
prop()修改状态值
$('input[type="checkbox"]').prop('checked')
//=> false
$('input[type="checkbox"]').prop('checked', true).val()
//=> ok
data()自定义属性
$('<div data-apple-color="red"></div>').data()
//=> { appleColor: 'red' }
$('<div data-apple-color="red"></div>').data('apple-color')
//=> 'red'
var apple = $('.apple').data('kind', 'mac')
apple.data('kind')
//=> 'mac'
val()赋值
$('input[type="text"]').val()
//=> input_text
$('input[type="text"]').val('test').html()
//=> <input type="text" value="test"/>
hasClass( className )
检查匹配的元素是否有给出的类名
$('.pear').hasClass('pear')//=> true
$('apple').hasClass('fruit')//=> false
$('li').hasClass('pear')//=> true
addClass(name)
增加class(es)给所有匹配的elements.也可以传函数。
$('.pear').addClass('fruit').html()//=> <li class="pear fruit">Pear</li>
$('.apple').addClass('fruit red').html()//=> <li class="apple fruit red">Apple</li>
removeClass([className])
从选择的elements里去除一个或多个有空格分开的class。如果className 没有定义,所有的classes将会被去除,也可以传函数
$('.pear').removeClass('pear').html()//=>Pear
$('.apple').addClass('red').removeClass().html()//=>Apple
find(selector)
获得一个在匹配的元素中由选择器滤过的后代
$('#fruits').find('li').length//=> 3
parent([selector])
获得通过选择器筛选匹配的元素的parent集合
$('.orange').parents().length// => 2
$('.orange').parents('#fruits').length// => 1
next()获得第一个本元素之后的同级元素
$('.apple').next().hasClass('orange')//=> true
$('.pear').next().html()//=> null
.nextAll()
获得本元素之后的所有同级元素
$('.apple').nextAll()//=> [<li class="orange">Orange</li>, <li class="pear">Pear</li>]
$('.apple').nextAll().length//=>2
prev()
获得本元素之前的第一个同级元素
$('.orange').prev().hasClass('apple')//=> true
preAll()
获得本元素前的所有同级元素
$('.pear').prevAll()//=> [<li class="orange">Orange</li>, <li class="apple">Apple</li>]
slice(start,[end])
获得选定范围内的元素数组
$('li').slice(1).eq(0).text()//=> 'Orange'
$('li').slice(1, 2).length//=> 1
siblings(selector)
获得被选择的同级元素(除去自己)
$('.pear').siblings().length//=> 2
$('.pear').siblings('.orange').length//=> 1
$('.pear').siblings('.pear').length//=> 0
first()
会选择chreeio对象的第一个元素
('#fruits').children().first().text()//=> Apple
last()
会选择chreeio对象的最后一个元素
$('#fruits').children().last().text()//=> Pear
eq(i)
通过索引筛选匹配的元素。使用.eq(-i)就从最后一个元素向前数。
$('li').eq(0).text()//=> Apple
$('li').eq(-1).text()//=> Pear
children(selector)
获被选择元素的子元素
$('#fruits').children().length//=> 3
$('#fruits').children('.pear').text()//=> Pear
each(function(index,element))
迭代一个cheerio对象,为每个匹配元素执行一个函数。要提早跳出循环,返回false.
var fruits = [];
$('li').each(function(i, elem) {
fruits[i] = $(this).text();
});
fruits.join(', ');
//=> Apple, Orange, Pear
map(function(index,element))
迭代一个cheerio对象,为每个匹配元素执行一个函数。Map会返回一个迭代结果的数组。
$('li').map(function(i, el) {
return $(this).attr('class');
}).join(', ');
//=> apple, orange, pear
filter(selector)
迭代一个cheerio对象,滤出匹配选择器或者是传进去的函数的元素。如果使用函数方法,这个函数在被选择的元素中执行,所以this指向的手势当前元素。
$('li').filter('.orange').attr('class');//=> orange
$('li').filter(function(i, el) {
// this === el
return $(this).attr('class') === 'orange';
}).attr('class')
//=> orange
append(content,[content…])
在每个元素最后插入一个子元素
$('ul').append('<li class="plum">Plum</li>')
$.html()
//=>
// <li class="apple">Apple</li>
// <li class="orange">Orange</li>
// <li class="pear">Pear</li>
// <li class="plum">Plum</li>//
prepend(content,[content,…])
在每个元素最前插入一个子元素
$('ul').prepend('<li class="plum">Plum</li>')
$.html()
//=>
// <li class="plum">Plum</li>
// <li class="apple">Apple</li>
// <li class="orange">Orange</li>
// <li class="pear">Pear</li>
after(content,[content,…])
在每个匹配元素之后插入一个元素
$('.apple').after('<li class="plum">Plum</li>')
$.html()
//=>
// <li class="apple">Apple</li>
// <li class="plum">Plum</li>
// <li class="orange">Orange</li>
// <li class="pear">Pear</li>
before(content,[content,…])
在每个匹配的元素之前插入一个元素
$('.apple').before('<li class="plum">Plum</li>')
$.html()
//=>
// <li class="plum">Plum</li>
// <li class="apple">Apple</li>
// <li class="orange">Orange</li>
// <li class="pear">Pear</li>
remove( [selector] )
从DOM中去除匹配的元素和它们的子元素。选择器用来筛选要删除的元素。
$('.pear').remove()
$.html()//=>
// <li class="apple">Apple</li>
// <li class="orange">Orange</li>
replaceWith( content )
替换匹配的的元素
var plum = $('<li class="plum">Plum</li>')
$('.pear').replaceWith(plum)
$.html()
//=>
// <li class="apple">Apple</li>
// <li class="orange">Orange</li>
// <li class="plum">Plum</li>//
empty()
清空一个元素,移除所有的子元素
$('ul').empty()$.html()
html( [htmlString] )
获得元素的HTML字符串。如果htmlString有内容的话,将会替代原来的HTML
$('.orange').html()
//=> Orange
$('#fruits').html('<li class="mango">Mango</li>').html()
//=> <li class="mango">Mango</li>
text( [textString] )
获得元素的text内容,包括子元素。如果textString被指定的话,每个元素的text内容都会被替换。
$('.orange').text()//=> Orange
$('ul').text()//=> Apple// Orange// Pear
下载类
var http = require("http");
function download(url, callback) {
http.get(url, function(res) {
var data = "";
res.on('data', function (chunk) {
data += chunk;
});
res.on("end", function() {
callback(data);
});
}).on("error", function() {
callback(null);
});
}
exports.download = download;
下载类的使用
var cheerio = require("cheerio");
var loadUrl = require("./loadUrl");
var url = "http://www.example.com"
loadUrl.download(url, function(data) {console.log(data);});