首先,先在头部引用需要用到的方法
const url = require("url")
const fs = require("fs")
const path = require("path")
创建一个函数,用于根据不同的文件类型获取不同的Content-Type
function getFileMime(extname) {
let data = fs.readFileSync('./data/mime.json')
let mimeObj = JSON.parse(data.toString())
return (mimeObj[extname])
}
然后创建一个函数,将静态web服务封装
function initStatic(req, res, staticPath) {
//1、获取地址
let pathname = url.parse(req.url).pathname;
//获取文件后缀名
let extname = path.extname(pathname);
//当文件后缀名存在时,才继续执行下面的步骤
if (extname) {
if (pathname != '/favicon.ico') {
try {
let data = fs.readFileSync('./' + staticPath + pathname);
if (data) {
let mime = getFileMime(extname);
res.writeHead(200, { 'Content-Type': '' + mime + ';charset="utf-8"' });
res.end(data);
}
} catch (error) {
console.log(error)
}
}
}
}
将请求都封装至一个函数内,最后再将这个函数暴露出去
function server() {
//根据不同的请求,将方法进行区分
let G = {
_get: {},
_post: {},
staticPath: ''//默认目录
}
let app = (req, res) => {
//配置静态web服务
initStatic(req, res, G.staticPath)
let pathname = url.parse(req.url).pathname;
let method = req.method.toLowerCase();
let extname = path.extname(pathname);
if (!extname) {
if (G['_' + method][pathname]) {
if (method == "get") {
G['_' + method][pathname](req, res);//执行get方法
} else {
let postData = '';
req.on('data', (test) => {
postData += test;
})
req.on('end', () => {
console.log(postData)
//整理前端post的值
//console.log(querystring.parse(postData));
req.body = postData;
G['_' + method][pathname](req, res);//执行post方法
})
}
} else {
res.writeHead(404, { 'Content-Type': 'text/html;charset="utf-8"' });
res.end("页面不存在")
}
}
}
app.get = function (str, cb) {
//注册方法
G._get[str] = cb;
}
app.post = function (str, cb) {
//注册方法
G._post[str] = cb;
}
//配置静态web服务
app.static = function (staticPath) {
console.log(staticPath)
G.staticPath = G.staticPath + staticPath
}
return app;
}
module.exports = server();
最后在外部调用时,一局以下格式即可调用get,post以及静态web服务方法
const http = require("http")
const app = require('./module/test.js')
//注册web服务
http.createServer(app).listen(3000);
//执行静态web服务
app.static("");
console.log('Server running at http://127.0.0.1:3000/');
//配置路由
app.get('/test1',function(req,res){
res.writeHead(200, { 'Content-Type': 'text/html;charset="utf-8"' });
res.end("执行get请求成功")
})
//配置路由
app.post('/test2',function(req,res){
res.writeHead(200, { 'Content-Type': 'text/html;charset="utf-8"' });
res.end(req.body)
})