static
static 中间件主要用来提供静态资源服务 ,可以设置静态资源的目录 设置响应头 及缓存等等配置,代码如下
function static(root,options = {}){
let { dotfiles = "ignore" ,etag=true,lastModified,maxAge=0, setHeaders } = options;
return function(req,req,next){
let { pathname } = url.parse(req.url,true);
let file = path.join(root,pathname);
let parts = file.split(path.sep);
let isDotFile = parts[parts.length-1][0]==".";
if(isDotFile && dotfiles=="deny"){ //拒绝访问.文件
res.setHeader("Content-Type","text/html");
res.statusCode = 403;
return res.end(http.STATUS_CODES[403]);
}
fs.stat(file,function(error,stat){
if(error){
next()
}else{
if(etag){
res.setHeader("ETag",stat.mtime.toLocaleDateString());
}
if(lastModified){
res.setHeader("Last-Modified",stat.mtime.toUTCString())
}
if(typeof setHeaders =='function'){
setHeaders(req,req,function(params){
console.log(params);
});
}
res.setHeader("Cache-Control",`max-age=${maxAge}`);
res.setHeader("Content-Type",mime.getType(file))
fs.createReadStream(file).pipe(res);
}
})
}
};
bodyParser
bodyParser 中间件用来解析请求参数
json
function json(options){
return function(req,res,next){
let contentType = req.headers["content-type"];
if(contentType=="application/json"){
const buffer = [];
req.on("data",function(data){
buffer.push(data);
});
req.on("end",function(){
let result = buffer.toString();
req.body = JSON.parse(result);
next()
})
}else{
next();
}
}
}
urlencoded
function urlencoded(options){
let { extended } = options;
return function(req,res,next){
let contentType = req.headers["content-type"];
console.log(contentType);
if(contentType=="application/x-www-form-urlencoded"){
const buffer = [];
req.on("data",function(data){
buffer.push(data);
});
req.on("end",function(){
let result = buffer.toString();
if(extended){
//qs 可以支持嵌套对象;
req.body = qs.parse(result);
}else{
req.body = querystring.parse(result);
}
next();
})
}else{
next();
}
}
}
text
function text(options){
return function(req,res,next){
const contentType = type.parse(req.headers["content-type"]);
const charset = contentType.parameters.charset;
const cType = contentType.type;
if(cType=="text/plain"){
const buffer = [];
req.on("data",function(data){
buffer.push(data);
});
req.on("end",function(){
let r = Buffer.concat(buffer);
if(charset=="gbk"){
req.body = iconv.decode(r,charset);
}else{
req.body = buffer.toString();
}
next()
})
}else{
next();
}
}
}