一、创建服务和监听端口
例如:
1)创建一个server.js
2)var http = require(“http”);
http.createServer(function(req,res){
res.writeHead(200,{'Content-type':'text/plain'});
res.end('Hello nodejs\n');
})
.listen(8090);
3)进入server.js所在目录 输入node server.js启动该服务
4)浏览器里面输入localhost:8090就可以看到页面输出了Hello nodejs。
二、模块化的概念,如何暴露和引入一个模块。
例如:
1)创建一个name.js
function addName(name){
console.log(name);
}
exports.addName=addName;//暴露模块方法
2)创建一个person.js
var addName=require("./name");//可以不加.js,./表示是当前目录下,这是引用模块
addName.addName("tom");
3)node person.js 终端会输出tom。
三、简单的API
var querystring=require("querystring");
1)querystring的操作方法
1.querystring.parse("name=aaa&&age=123","&","=");// {name:"aaa",age="123"} 第一个参数是要解析的字符串,第二个是根据什么分隔,第三个是键值对有什么区分
2.querystring.stringify({name:"aaa",age:123},"&","=");//name=aaa&age=123,序列化成一个字符串和parse正好相反,第二个和第三个参数可省略,parse也一样。
2)url的几个方法:
var url=require("url");
1.url.parse("url地址");
例如:
url.parse('http://www.baidu.com/login?name=aaa&age=123');//在node环境下输入改行回车会得到如下的结果
Url {
protocol: 'http:', //协议
slashes: true,
auth: null,
host: 'www.baidu.com',//主机(主机名+端口)
port: null,//端口号
hostname: 'www.baidu.com',//主机名
hash: null,
search: '?name=aaa&age=123',//查询条件
query: 'name=aaa&age=123',//查询列表
pathname: '/login',//路径名或者目录
path: '/login?name=aaa&age=123',//具体路径
href: 'http://www.baidu.com/login?name=aaa&age=123' }//完整路径
2.url.format();//和parse想法,可以把上面的结果传个format当参数,得到parse里面的参数串。
3.url.resolve("http://www.baidu.com/","login");// http://www.baidu.com/login 这个例子是添加,如果第一个参数是http://www.baidu.com/login,第二个参数是(/)admin,就会得到http://www.baidu.com/admin,是替换。
3)一些概念
1.回调函数:function m(a,cb){
if(a>10) cb(a);//cb就是回调函数
}
function cb(a){
console.log(a);
}
m(12,cb);//12
2.同步:js执行代码时候是一行一行按顺序执行,第一行结束才能到第二行;
3.异步:定时器,js代码按行顺序执行,碰到定时器,把定时器放到一个定时器的队列执行,然后执行定时器后面的代码,等所有顺序代码执行完后,将定时器队列的代码拼接到顺序的末尾。
4.事件:和js一样,不过没有冒泡捕获的过程,事件驱动,就是触发事件的执行函数。
(1)、on(“data”,function(){事件处理函数});定义事件
(2)、emit(“data”,“传的数据”);触发该事件;
(3)、也可以用addEventListener绑定事件,removeListener(“事件”,handler具名函数),移除事件,removeAllListeners();传入事件名就移除该类型的,否则全部。
(4)、事件最多不要超过10个,如下设置
var EventEmitter=require("events").EventEmitter;
var life = new EventEmitter();
life.setMaxListeners(10);//设置最多10个
5.作用域:在浏览器里面全局对象就是window,node里面是global,没有全局空间污染的概念,用到什么模块就去加载。
6.执行上下文:this
(1)、函数里面的this指向调用这个函数的对象。
(2)、对象的属性函数被该对象调用时候,this指向该对象。
(3)、时间间隔函数里面的this,指向global。
(4)、call applay改变this指向。
4)、http的两个方法(request 和get)
var http=require("http");
1.var reg=http.request(options,function(res){});//options:表示一个请求的参数集合对象,第二个是回调函数,res表示response。
例如:一个串该评论的例子
var http=require("http");
var querystring=require("querystring");
var postData=querystring.stringify({//就是浏览器中network下面提交评论的ajax 的post请求的headers中的form data数据
"commentid":"",
"content":"结构有点儿乱,不太清晰",
"replyId":""
});
var options={//就是浏览器中network下面提交评论的ajax 的post请求的headers中的request header里面的键值对,这里用符号代替了,
hostname:"",
port:80,
path:"/**********/*********",
headers:{
"Accept":"*/*",
"Accept-Encoding":"gzip, deflate",
"Accept-Language":"zh-CN,zh;q=0.8",
"Connection":"keep-alive",
"Content-Length":postData.length,
"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",
"Cookie":"。。。。。。。。。。。。。。。。。。。。。,
"Host":"。。。。。。。。。。。。。。。。。。。。。。",
"Origin":"。。。。。。。。。。。。。。。。",
"Referer":"。。。。。。。。。。。。。。。。。。。。。。。。",
"User-Agent":"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36",
"X-Requested-With":"XMLHttpRequest"
}
};
var req=http.request(options,function(res){
console.log("statusCode code:"+res.statusCode);
console.log("headers:"+JSON.stringify(res.headers));
res.on("data",function(data){
console.log(Buffer.isBuffer(data));
console.log(typeof data);
});
res.on("end",function(){
console.log("哈哈评论完了!");
})
});
req.on("error",function(e){
console.log("出错了:"+e.message);
})
req.write(postData);
req.end();
2.get 和request类似
例如一个简单爬取数据的例子:
http.get(url,function(res){
res.on("data",function(data){
html+=data;
});
res.on("end",function(){
console.log(html);//打印出来爬到的数据
});
}).on("error",function(e){
console.log("出错");
});
5).Promise 这里是npm 了bluebird插件,promise有三个状态(等待,执行完,执行失败)状态不可逆,等待可以到执行失败或者执行完
var Promise=require("bluebird");
function promiseFun(a){
return new Promise(function(resolve,reject){
if(a>10){
resolve(a);//执行完了的状态
}else{
reject(a);//执行失败的状态
}
});
}
promiseFun(11)
.then(function(data){//then是指promise对象的状态决定后执行的函数,第一个参数是resolve的回调,第二个是reject的回调,这样可以实现异步,结构也清晰好理解
console.log("resolve:"+data);
return promiseFun(8);//在promiseFun是resolve状态的情况下执行该行。
},function(data){
console.log("reject:"+data);
})
.then(function(data){
console.log("resolve:"+data);
},function(data){
console.log("reject:"+data);
});
6).流
1.Buffer对象 可以new Buffer(10);长度为十个字符,
var buf = new Buffer("abc",10);//定义一个buf对象赋值abc,10进制;打印出来就是61 62 63;ascii值
buf.toString();//abc
Buffer.isBuffer(buf);//true 判断是不是buffer对象实例
var buffer = new Buffer();
buffer.write("adfdfd");//buffer写入字符串
2. Stream
Stream 有四种流类型:
Readable - 可读操作。
Writable - 可写操作。
Duplex - 可读可写操作.
Transform - 操作被写入数据,然后读出结果。
所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:
data - 当有数据可读时触发。
end - 没有更多的数据可读时触发。
error - 在接收和写入过程中发生错误时触发。
finish - 所有数据已被写入到底层系统时触发。
例如:
var fs=require("fs");
var data = '';
// 创建可读流
var readerStream = fs.createReadStream('input.txt');
// 设置编码为 utf8。
readerStream.setEncoding('UTF8');
// 处理流事件 --> data, end, and error
readerStream.on('data', function(chunk) {
console.log(Buffer.isBuffer(chunk));//true chunk 是Buffer对象
data += chunk;
});
readerStream.on('end',function(){
console.log(data);
});
readerStream.on('error', function(err){
console.log(err.stack);
});
console.log("程序执行完毕");