使用nodejs封装一个类似express框架 封装静态web服务

首先,先在头部引用需要用到的方法

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)
})

 

上一篇:分享一个文件递归查询方法


下一篇:Coded UI Test(一)概述