node是js语言的服务器运行环境(类似于php和apache)
nodejs提供大量的工具库,使得javascirpt可以调用操作系统级别的api。
node采用谷歌的v8引擎(javascipt语言解释器),速度非常快跟js环境不一样,一个是运行在服务器,一个运行在客户端,node是一个基于事件驱动和异步io的服务器javascript环境
回调:异步编程的基本方法,采用后续函数传递的方式,把后续的处理函数作为参数进行执行
同步和异步(阻塞非阻塞):AJAX的时候说过
IO:input outputer
输入 输出,对应的就是下单操作
单线程和多线程
单线程按顺序执行,多线程可以同时执行
##### 三、HTTP请求
* req.url:'/',请求的地址 '/'根目录
* req.method: 'GET' 请求方式
* 发送 HTTP 头部
* HTTP 状态值: 200 : OK
* 内容类型: text/html
* res.writeHead(200,{Content-Type:xxx})
* http://tool.oschina.net/commons
```javascript
var http = require('http');//引入一个HTTP的模块
var server = http.createServer(function (req,res){// 创建一个HTTP服务器
//设置请求头 res.writeHead(HTTP状态值,{"内容类型":"text/html;charser:utf-8"})
res.writeHead(200,{"Content-Type":"text/html;charser:utf-8"})
//判断页面输入的地址
if(req.url=="/index"||req.url=="/"){
res.end("首页");
}else if(req.url=="/login"){
res.end("登陆页");
}else{
res.writeHead(404);//向请求的客户端发送响应头。
res.end("404:没有找到该页面");
}
class="se-preview-section-delimiter">div>
四、引入url的模块
- url模块
- url = require(‘url’);
- url.parse(url,bol);
var http = require('http');//引入一个HTTP的模块
var url = require('url');//引入一个url的模块
var server = http.createServer(function (req,res){
//如果第二个参数是true 返回的query 是一个json格式,否则是字符串
var oUrl = url.parse(req.url,true);
console.log(oUrl);
res.end("end");
})
server.listen(8080,function(){
console.log('开启成功')
});
<div class="se-preview-section-delimiter">div>
五、require(引入路径)
note.js部分
//连接test文件夹
var test = require("test");
/*require(文件名):如果 路径.js 存在 执行加载 并 返回
如果 路径.node 存在 执行加载 并 返回 如果 路径/package.json 存在
执行加载(package.json 中 main属性对应的路径) 并 返回 否则 抛出异常
注:如果没有package.json需要创建 设置路劲
*/
test.show();
<div class="se-preview-section-delimiter">div>
package.json部分
{
"name": "test",
"version": "0.0.1",
"main":"abc.js"
}
"se-preview-section-delimiter">
注:package.json里面不能写注释,会报错
abc.js部分
function show(){
console.log("abc.js");
}
function sum(a,b){
console.log(a+b);
}
//module.exports等于reture 返回出去(个人理解)
module.exports.show = show;
module.exports.sum = sum;
<div class="se-preview-section-delimiter">div>
六、buffer对象
- js语言自身只有字符串数据类型,没有二进制类型
- buffer:缓存器区,暂时存放在内存里的一段数据
- 由一个八位字节一个元素组成的数组,单位用16进制表示,取值范围0-255
//创建buffer对象的方法:
//1.直接创建
var buf = new Buffer(6);
buf.fill(255);//填充255 输出buf=6个 ff
console.log(buf);
//2.通过数组
var buf2= new Buffer([255,100,5,0xbb])
console.log(buf2);
//3.通过字符串 一个中文 等于 00 00 00 三个buffer;
var buf3 = new Buffer("内容");
console.log(buf3);
//把buf转为字符串
console.log(buf3.toString());
//创建指定的buffer转为字符串
var buf4= new Buffer([0xe5,0x86,0x85]);
console.log(buf4.toString());
class="se-preview-section-delimiter">
七、文件系统模块(fs)
- 读取文件方法
- readFile(异步)
- readFileSync(同步)
//异步模式(一起执行)
var fs = require('fs');
fs.readFile("test/abc.txt",function(err,data){
if(err){console.log(err);return;}
console.log(data.toString());
console.log(2);
});
<div class="se-preview-section-delimiter"></div>
//同步模式(一句句执行)
var con = fs.readFileSync("test/abc.txt");
console.log(con.toString());
console.log(2);
八、文件操作(目录操作)
//加载fs模块
var fs = require("fs");
/*
* 777分别代表所有者,组用户,其他用户所具有的权限
* 1 = 执行 2 = 写 4 = 读 1+2+4=7 *
*/
//1.创建文件mkdir(路径/文件字,权限 ,fn(err))
fs.mkdir("test/abc1",0777,function(err){
返回失败信息
if(err){console.log("创建失败:"+err);return;}
console.log("创建成功");
});
//2.读取目录所有文件readdir(url,fn(err,files))
fs.readdir("./",function(err,files){
console.log(files)
})
//3.判断文件是否存在
// fs.existsSync(urlstr)
var bol=fs.existsSync("test/abc.txt");
console.log(bol);
//4.获取文件或文件夹的详细信息
// var stat = fs.lstatSync(urlstr);
var stat = fs.lstatSync("test/abc.txt");
console.log(stat);
//5.如果是文件返回true否则false
var isfile = stat.isFile();
console.log(isfile);
九、stream
- stream,主要是用在大数据处理.
- var rs = createReadStream创建一个可读流
- var ws = createWriteStream创建一个可写流
- pipe该方法从可读流中拉取所有数据,并写入到所提供的目标。
- rs.on(‘data’,fn(data))每读64K或读完触发的时间
- rs.on(“end”)
var fs = require("fs");
var rs = fs.createReadStream("111.zip");
var ws = fs.createWriteStream("test/a.zip");
//过程
var i = 0;
//每读取64KB触发下面的函数
rs.on("data",function(){
i++;
console.log(i);
}
//输出结束时候的i
rs.on("end",function(){
console.log(i);
})
rs.pipe(ws);
10、post
//加载http模块
var http = require("http");
//加载fs模块
var fs = require("fs");
var server = http.createServer(function(req,res) {//创建一个http模块
var isfile = false;
//判断文件是否存在
var bol = fs.existsSync("www" + req.url);
if (bol) {
//获取文件信息
var stat = fs.lstatSync("www" + req.url);
isfile = stat.isFile();//查看是否文件 是返回true 否则false
}
//判断打开的是/
if (req.url == '/') {
//打开文件 fs.readFile(路径,(fn(err,data)(回调函数){}) 打开输出的是Buffer数据
fs.readFile("www/index.html", function (err, data) {
res.end(data.toString());//Buffer转换字符串 输出
})
} else if (isfile) {
//如果是文件夹 使用stream流传输
var rs = fs.createReadStream("www" + req.url);
rs.pipe(res);
}
else {
//全部不是返回404
res.end();
}
})
server.listen(8080,function(){
console.log('开启成功:http://localhost:8080')
});
优化版本
“`
var server = http.createServer(function(req,res) {//创建一个http模块
var url = req.url;
if(url==”/”){
url=”/index.html”;//默认当前目录读取当前index文件
}
var isfile =false;
//判断文件
var bol=fs.existsSync(“www”+url);
if(bol){
//获取文件信息
var stat = fs.lstatSync(“www”+url);
isfile = stat.isFile();//查看是否文件
}
//判断是否是文件夹
if(isfile){
//如果是文件夹 使用stream流传输
var rs = fs.createReadStream(“www”+url);
rs.pipe(res);//请求打开文件www+ulr 例如/www/index.html
}
else{
//全部不是返回404
res.end(“404”);
}
console.log(req.url);
});
server.listen(8080,function(){
console.log(‘开启成功:http://localhost:8080‘)
});