一 node简介
node属于服务器端的语言,服务端:javascript,V8引擎运行,性能很快,直接运行js到服务器端。
http模块:服务器http协议模块;
url模块:路径解析模块,使用parse 方法解析路径;
二 创建服务器
- req: 服务端路径相关信息;
- res :浏览器的响应信息;
- 设置http的响应头:
参数1: 服务器的响应状态 :200:成功 、 500 :服务器报错; - 通过parse 方法直接将query上的传值解析为json,
设置parse方法参数2为true自动将query解析为json; - req.url:输出服务器端的路径,这种解析就是前端的get传值;
let http=require("http"); //加载http模块
let url=require("url") //加载url模块 使用parse 方法解析路径
let server=http.createServer((req,res)=>{
res.writeHead(200,{"Content-Type":"text/html;charset=utf-8;"});
// 在服务器 解析一个路径
//let location="http://www.maodou.com?name=张三&id=10086"
//通过parse 方法 解析路径
//let pathName=url.parse(location,true);
// 服务端写入数据
//res.write(JSON.stringify(pathName.query));
let path=url.parse(req.url,true);
//下面代码可以直接解析出服务器路径上的传值
res.write(JSON.stringify(path.query));
res.end(()=>{
console.log("服务器响应结束");
});
}).listen(8000,'127.0.0.1',()=>{
// loaclhost 127.0.0.1
console.log("http://localhost:8000");
});
- module.exports=server;:将服务端模块暴露出去;
module.exports = (callback) => {
http.createServer((req, res) => {
callback(req,res);
}).listen(8000, '127.0.0.1', () => {
console.log("http://127.0.0.1:8000");
});
};
不使用相对路径去找,node会自动找node_modules下的文件,如:
let server = require("createServer");
这里有一个问题:node_modules文件存在文件夹,获取文件里面的文件服务端会报错,找不到文件。如何处理:去对应的文件夹下生产配置文件,直接获取文件名称:
let user = require("data");
cnpm init --yes 强制生成
三 关于文件的操作
- Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。异步读取参数包括: url 、option 、{encoding:’’,flag:’’} 、callback。异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。
建议大家使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。
let fs = require('fs');//加载文件系统模块
module.exports = {
readfile() {
//异步读取文件
let url = "./page/stu.txt";//给出需要读取的文件路径
fs.readFile(url, (error, data) => {
if (error) {
throw error
}
console.log(data.toString());
});
}
}
data 返回的数据格式是buffer格式,buffer 转化字符串:toString() ;
同步读取方法:
let data=fs.readFileSync(url).toString();
console.log(data);
- 文件读取的方法调用:fs.readfile();
- 检测是文件还是目录:fs.stat();
stats.isFile() :如果是文件返回 true,否则返回 false;
stats.isDirectory():如果是目录返回 true,否则返回 false;
stat() {
//判断是否是目录还是文件
//异步方法
fs.stat('./comment', (err, stats) => {
if (err) {
throw err;
}
console.log(stats.isFile());
console.log(stats.isDirectory());
});
- 打开文件 :open ;
r+ :可读可写;
r :可读 ;
fd : 是number;
关闭文件:close;
fs.open('./comment/router', 'r+', (err, fd) => {
if (err) {
throw err;
}
console.log("文件以打开");
console.log("这里在操作");
//关闭文件
fs.close(fd, (err) => {
if (err) {
console.log("关闭失败");
return;
}
console.log("关闭成功!");
});
- 创建文件 :mkdir 。创建目录 一般用于文件上传;
- 移除目录:rmdir;
fs.mkdir("./comment/user", (err) => {
if (err) {
console.log("文件已存在!");
//移除目录
fs.rmdir('./comment/user',(error)=>{
if(error){
console.log("删除目录失败");
return;
}
console.log("删除成功!");
});
return;
}
console.log("创建文件成功!");
});
- writeFile :写入文件, 写入之后会覆盖之前的内容;
- appendFile:写入追加;
- unlink、rmdir:单文件删除;
fs.unlink('./page/stu.txt', (err) => {
if (err) {
console.log("删除失败!");
return;
}
console.log("删除成功!");
});
fs.rmdir('./page', (err) => {
if (err) {
console.log("删除失败!");
return;
}
console.log("删除成功!");
});
}
node里面的文件流
(一)读取流
- 读取流:let data="",接收读取的数据;
- 创建读取流:
let readStream=fs.createReadStream('public/jq.txt',{flags:'r+',encoding:'utf-8',start:0,end:1024});
- 设置读取流的编码格式:
readStream.setEncoding('utf-8');
- 使用流的监听事件 去监听:
readStream.on('data',(res)=>{
//当有数据可读的时候触发
data+=res;
});
readStream.on('end',()=>{
//当没有数据可读的时候
//console.log(data);
//创建写入
let writeStream=fs.createWriteStream('public/data.txt',{flags:'r+',encoding:'utf-8'});
writeStream.write(data);
});
readStream.on('error',(err)=>{
//读取或者写入的时候触发事件
console.log(err);
});
(二)写入流
- 创建写入流:
let writeStream=fs.createWriteStream('public/data.txt');
- 设置写入的数据和编码:
writeStream.write('写入流','utf-8');
- 写入完成,监听:
writeStream.end();
writeStream.on('finish',()=>{
console.log('写入完成');
});
(三)管道流
管道流:边读边写;
let readStream=fs.createReadStream('public/jq.txt');
let writeStream=fs.createWriteStream('public/data.txt');
//管道
readStream.pipe(writeStream);
(四)链式流
let zib=require('zlib');//文件压缩
fs.createReadStream('public/jq.txt').pipe(zib.createGzip()).pipe(fs.createWriteStream('public/jq.zip'));