1:node.js 简介
node.js 就是运行在服务端的 JavaScript。
Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。
Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。
使用版本可以通过在$ node -vl来查看2:建立服务器
先创建server.js文件,在下面写如下代码
var http = require('http');
var server = http.createServer(function(req,res){
res.end('hello world')
})
server.listen(8080);
console.log('server is running')
在git打开相应文件夹,输入命令node server.js,git打印出
server is running
此时访问
如果需要改变需要重新开启.
淘宝演示:
var http = require('http');
var fs = require('fs');
var server = http.createServer(function(req,res){
fs.readFile('./taobao.html','utf-8',function(err,data){
res.end(data);
})
})
server.listen(8080);
console.log('server is running');
可在8080端口显示淘宝网页
3:模块化开发(后期整理)
AMDcmd conmom.js
(moudle.exports require)
4 event模块
var event = require('events');
var event1 = new event();
event1.on('call',function(){
console.log('calling 1');
})
event1.emit('call');
在git命令中输入node 文件名,可以打印出来calling 1
emit的作用是触发绑定事件,on是绑定事件,第一个名称。第二个参数是触发函数。
event1.once('call',function(){
console.log('calling 1');
})
once可以绑定事件,但是只能触发一次.其他和on一样.
event1.on('call',function(){
console.log('calling 1');
}) 可以通过event1触发多个事件,每个绑定就好
on:添加事件
once:添加只触发一次的事件
prependListener:和on一样,事件添加到事件队列头部
prependOnceListener:和once一样,事件添加到
emit:触发事件
removeListener:删除某个事件
可以在函数内面传参
event1.on('call',function(name,age){
console.log(name,age);
console.log('calling 1');
})
event1.emit('call','666','20');
可以直接打印出来666.206: fs模块 (1)文件操作
文件操作fs.readFile(file[, options], callback)fs.readFileSync(file[, options])fs.writeFile(file, data[, options], callback)fs.writeFileSync(file, data[, options])fs.stat(path, callback)fs.statSync(path)
const fs = require('fs');
fs.readFile('./data.txt','utf-8',function(err,data){
if(err){
return ;
}
fs.writeFile('./dest.txt',data,'utf-8',function(err,data){
console.log('write success')
})
console.log(data);})在同一目录下的data文件被读取,可显示内容,不加utf-8的话,出来的是16进制编码.writeFile可以创建一个文件叫dest.txt的,内容是data.如果传别的,会进行覆盖
let data = fs.readFileSync('./data.txt','utf-8');
console.log(data)
上边的这个是同步执行,不用回调函数,上面先打印data然后自己的data然后write success
let stat = fs.statSync('./data.txt');
console.log(stat)
上面打印出文件属性,创建时间等等.(可用于判断文件是不是文件夹或者是文件,可返回ture后者false)
7:fs模块 (2)文件夹操作
fs.mkdir(path[, mode], callback)fs.mkdirSync(path[, mode])fs.readdir(path[, options], callback)fs.readdirSync(path[, options])
fs.mkdir(path[, mode], callback)可以直接在git里面执行,例如mkdir dir2就可以创建一个以dir2为名的文件夹
fs.mkdir可以返回出dir4下面的文件夹
fs.readdir('./dir4',function(err,data){
console.log(data);
})
8:fs模块 (3)流操作
const fs = require('fs');
const rs = fs.createReadStream('./111.txt');
rs.on('data',function(data){
console.log(data);
})
rs.on('end',function(){
console.log('end')
})
输出:加载就打印出来,每64k为一个buffer,每次读取完把data传进来
const rs = fs.createReadStream('./111.txt','utf-8');
这么写的话,编码方式发生改变,不再是2进制![](https://img-blog.csdn.net/20180302164231134?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWxpdWppdWppYW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
const rs = fs.createReadStream('./111.txt',{
encoding:'utf-8',
start:10,
end:20
});
这个是编码方式为utf-8方式,截取为第十个字节到第二十个字节的内容,可能会出现乱码中文的话(每三个字节为一个汉字)
rs.
pause();
setTimeout(
function() {
rs.
resume()
},
1000);
写的流操作:
const fs = require('fs');
const rs = fs.createReadStream('./111.txt','utf-8');
const ws = fs.createWriteStream('./222.txt');
rs.on('data',function(data){
ws.write(data);
})
rs.on('end',function(){
ws.close();
console.log('write close')
})
建立一个222.txt的文件,内容和111一样,如果111中更新,222中会覆盖
const
ws =
fs.
createWriteStream(
'./222.txt',{
flags:
'a'
}); //这样不是覆盖了,而是添加
const fs = require('fs');
const rs = fs.createReadStream('./111.txt','utf-8');
const ws = fs.createWriteStream('./222.txt',{
flags:'a'
});
rs.pipe(ws)
这样可以和上述实现一样效果,
rs.pipe(ws)可以实现边读边写
9:watch
const fs = require('fs');
const rs = fs.createReadStream('./111.txt');
const ws = fs.createWriteStream('./222.txt');
fs.watch('./111.txt',function(name,file){
const rs = fs.createReadStream('./111.txt');
const ws = fs.createWriteStream('./222.txt');
rs.on('data',function(data){
ws.write(data);
})
rs.on('end',function(){
ws.close();
})
})
可以监听111中的文件,222中和111中的文件一样可以用另一种写法:
const fs = require('fs');
const rs = fs.createReadStream('./111.txt');
const ws = fs.createWriteStream('./222.txt');
fs.watch('./111.txt',function(name,file){
const rs = fs.createReadStream('./111.txt');
const ws = fs.createWriteStream('./222.txt');
rs.pipe(ws)
})
10:网络操作
http.Server的方法
on:给server添加事件处理函数listen:使用服务器监听端口const http = require('http');
const server = http.createServer(function(req,res){
res.end('hello world')
})
server.listen(3000);
在3000端口号创建一个服务器,不论什么请求都返回hello world
const server = http.createServer()
server.on('request',function(req,res){
res.end('hello world')
})
两种写法效果一样
http.Server的事件
- request
- close
server.on('close',function(){
console.log(111);
})
上述代码写的事服务器异常关闭的时候,打印111;
http.IncomingMessage
封装了客户端发送过来的请求
重要的属性和方法
- req.headers:请求头
- req.url:请求路径
- req.method:请求方法
- req.httpVersion:http协议的版本
- http.ServerResponse
- 可操作返回给用户的响应
- 重要的属性和方法
- res.end([data][,encoding][,callback])
用于声明整个请求已经发送完毕,每个响应必须调用一次
- res.write(chunk[,encoding][,callback])
用于往请求主体汇总写入数据
- res.statusCode()
可操作响应状态码
res.statusCode = 200;
- res.statusMessage()
可操作响应状态信息
res.statusMessage = 'failed'
- res.writeHead(statusCode[,statusMessage][,callback])
11:
const http = require('http');
const server = http.createServer(function(req,res){
if(req.url ==='/taobao'){
res.end('taobao');
}else if(req.url ==='/baidu'){
res.end('baidu')
}else{
res.end('404')
}
})
server.listen(3000);
效果如上
const http = require('http');
const fs = require('fs');
const server = http.createServer(function(req,res){
if(req.url ==='/taobao'){
fs.readFile('./views/taobao.html',function(err,data){
if(err){
res.statusCode = 500
res.statusMessage = 'server is done';
}
res.end(data);
})
这样的话可以直接显示淘宝页面