缓存
// 使用cache-control 控制缓存策略,expires 控制缓存时间
res.setHeader('cache-control','no-cache');//设置不缓存,这是个坑
// 第一次请求时,服务器像浏览器发送了文件最后修改啊日期,
// 浏览器再次向服务器发送请求时,会将当前的最后修改日期发送,如果服务器发现该日期是最新版,就会直接返回304.否则会发送新的文件.
const server = http.createServer((req,res)=>{
let {pathname} = url.parse(req.url);
// let gz = zlib.createGzip();
// res.setHeader('content-encoding','gzip');
// ins.pipe(gz).pipe(res);
//获取并处理文件最后一次的修改日期
fs.stat(`www${pathname}`,(err,stat)=>{
if(err){
res.writeHead(404);
res.write('Not Found');
res.end();
}else{
if(req.headers['if-modified-since']){//如果浏览器发送了版本日期
let reqdate = req.headers['if-modified-since'];//获取日期
let oDate = new Date(reqdate);//转换成Date日期
let tClient = Math.floor(oDate.getTime()/1000);//浏览器发送过来的日期
let tServer = Math.floor(stat.mtime.getTime()/1000);//服务器查到的日期
if(tServer>tClient){//如果服务器比较新,就发送新的
sendFileToClient();
}else{//使用缓存
res.writeHead(304);
res.write('Not Modified');
res.end();
}
}else{//没发送版本日期的时候,直接发送文件
sendFileToClient();
}
}
function sendFileToClient(){
let ins =fs.createReadStream(`www${pathname}`);
res.setHeader('Last-Modified',stat.mtime.toUTCString());//此处处理头,将最后一次文件的修改信息传给浏览器
ins.pipe(res);
ins.on('error',err=>{
res.writeHead(404);
res.write('Not Found');
res.end();
})
}
})
});
Node多进程
Node.js默认情况下是单进程与单线程的
使用cluster 、process 模块
多进程
1. 是安全的,而且性能高.
2. 普通程序不能创建进程,只有系统进程才可以创建进程.
3. 进程是分裂出来(只有主进程可以分裂,子进程不可以分裂),分裂出来的两个进程执行的是同一套代码(即父子进程执行同一套代码).
4. 父子进程之间可以分享句柄.
const cluster = require('cluster');
const http = require('http');
const cluster = require('cluster');//创建进程模块
const os = require('os');//系统模块,用来获取当前主机有几个CPU
const process = require('process');//控制进程模块
if(cluster.isMaster){//判断是主进程,才可以分裂
for(let i=0;i<os.cpus().length;i++){//控制有几个CPU就分裂几次
cluster.fork();//进程分裂
}
console.log('主进程');
}else{//如果是个子进程就开启一个服务器
const server = http.createServer((req,res)=>{
console.log(process.pid);//获取进程ID
res.write('s')
res.end();
})
server.listen(8087)
console.log('子进程开启的8087服务器');
}
数据库
数据库
1. 服务端(下载的mysql数据库)
2. 客户端(Navicat、NodeJS、JAVA、PHP等)
扩展
使用encodeURIComponent
使用encodeURIComponent('待转码字符') 在前端将数据转码,
使用decodeURIComponent('转码后的字符') 在服务器端将数据转回.
断点续传
使用content-range 进行断点续传操作.
网友评论