Node.js 实现Express.static静态文件中间件
const http = require('http');
const mime = require('mime');
const fs = require('fs');
const url = require('url');
const path = require('path');
function static(root, options = {}) {
return function (req, res, next) {
const { pathname } = url.parse(req.url, true);
const { etag = true, lastModified = true, maxAge = 0, setHeaders = () => { } } = options;
if (pathname == '/') return next();
const file = path.join(root, pathname);
fs.stat(file, (err, stat) => {
if (err) {
next();
} else {
const contentType = mime.getType(pathname);
res.setHeader('Content-Type', contentType);
if (etag) {
res.setHeader('ETag', stat.ctime.toLocaleDateString());
}
if (lastModified) {
res.setHeader('Last-Modify', stat.ctime.toUTCString());
}
if (maxAge) {
res.setHeader('Cache-Control', `max-age=${maxAge}`);
}
fs.createReadStream(file).pipe(res);
}
})
}
}
module.exports = static;