美文网首页
原生Node搭建服务

原生Node搭建服务

作者: i_木木木木木 | 来源:发表于2020-05-21 11:29 被阅读0次

1.目录结构及说明

目录结构

---datafuns:处理各个接口的方法
------datas:各个接口的数据文件
---------users.json: user接口的数据文件
------public_fun.js :处理各个接口使用到的公共方法
------users.js:处理user接口的具体方法
---files:存储上传文件的目标目录(自动创建)
---sall_datas.js :一些如状态码之类的数据模板
---server.js:服务主文件

2.server.js

/*服务逻辑处理*/
const http = require("http");
const url = require("url");
const path = require("path");
const fs = require("fs");
const queryString = require("querystring");
const sallDatas = require("./sall_datas");
/*状态码管理*/
const statusInfo = sallDatas.statusInfo;
/*文件头*/
const mineTypeMap = sallDatas.mineTypeMap;

// console.log(statusInfo)
/*////////////////////////////////////*/
// 1.创建一个服务器实例对象
let server = http.createServer(function (req,res) {
    // 关闭nodejs 默认访问 favicon.ico
    const pathname = url.parse(req.url).pathname;
    if (!pathname.indexOf('/favicon.ico')) {
        return;
    };


});
/* 2.监听用户请求*/
server.on("request",  (req, res) => {
    console.log(req.method);
    /*请求头,跨域处理*/
    const Heads = {
        // " Access-Control-Max-Age": 86400,    ////表明该响应的有效时间为 86400 秒,也就是 24 小时。在有效时间内,浏览器无须为同一请求再次发起预检请求。
        "Content-Type":"application/json;charset=utf-8",
        'Access-Control-Allow-Headers':'Origin, X-Requested-With, Content-Type, Accept,token',  //访问控制允许报头 X-Requested-With: xhr请求
        'Access-Control-Allow-Metheds':'PUT, POST, GET, DELETE, OPTIONS',   //////访问控制允许方法
        'X-Powered-By':'nodejs',    //////自定义头信息,表示服务端用nodejs
        "Access-Control-Allow-Origin":"*",    ////访问控制允许来源,可以是*,也可以是跨域的地址
    }
    // res.writeHead(200, Heads);

    /*获取当前路由及请求信息*/
    let obj = url.parse(req.url, true);
    // console.log(obj)
    /*获取路由*/
    const pathname = obj.pathname;

    /*1.定义参数格式*/
    let querys = {
        h_files:[],     ////文件参数
        h_datas:{}      ////文本参数
    };
    /*2.定义返回数据的格式*/
    let rdata = {
        status:{code:2000,msg:'成功'},
        data:{ }
    }
    /*处理请求方式*/
    if(req.method === "OPTIONS"){
        ////预请求时只返回状态码   不返回具体内容
        rdata.status = {code:2004,msg:'成功'};    ////204返回也不会显示返回的body
        rdata.data = {};    ////204返回也不会显示返回的body

        res.writeHead(204, Heads)
        res.write(JSON.stringify(rdata));  ////204返回也不会显示返回的body
        res.end();
    }else
    if(req.method === "GET"){
        /*获取接口路由*/
        const apipath = apiPathFun(pathname);

        if(apipath === '/files/'){   ////处理静态文件请求
            /////*获取接口路由除最后一部分*/
            const lastpath = path.basename(pathname.split('/')[pathname.split('/').length - 1]);
            const f_path = './files/'+ lastpath;
            // console.log(lastpath)

            if(fs.existsSync(f_path)){    ////判断文件是否存在
                /*获取后缀名*/
                const extName = path.extname(pathname).substr(1);
                if (mineTypeMap[extName]) {
                    res.setHeader('Content-Type', mineTypeMap[extName]);
                }
                /*返回文件*/
                const stream = fs.createReadStream(f_path);
                stream.pipe(res);
            }else{
                // console.log(404);
                /////*匹配状态码*/
                rdata = isCodeFun(404);

                /////*返回信息头,返回数据,结束请求*/
                res.writeHead(404, Heads)
                /////*返回数据*/
                res.write(JSON.stringify(rdata));
                res.end();
            }

        }else{
            /////*获取需求参数*/
            querys.h_datas = obj.query;
            /////*获取需求数据*/
            const fdata =  getFun(pathname,querys);
            /////*匹配状态码*/
            rdata = isCodeFun(fdata.code);

            /////*填充data中的数据*/
            rdata.data = fdata.data;

            /////*返回信息头,返回数据,结束请求*/
            res.writeHead(fdata.code, Heads)
            /////*返回数据*/
            res.write(JSON.stringify(rdata));
            res.end();
        }
    }else
    if(req.method === "POST"){
        // console.log(pathname.length)
        /*判断是否是根,是根不能post*/
        if(pathname.length <= 1){
            /////*匹配状态码*/
            rdata = isCodeFun(400);

            res.writeHead(400, Heads)
            res.write(JSON.stringify(rdata));
            res.end();
            return;
        }

        /////*判断token*/
        // console.log(req.headers)
        if(req.headers.token){
            querys.h_datas["token"] = req.headers.token;

            const base_token = 'tokentokentokentokentoken'  ////后端真实token

            if(req.headers.token !== base_token){
                /////*匹配状态码*/
                rdata = isCodeFun(403);
                rdata.data["msg"] = "请重新登录!"
                res.writeHead(403, Heads)
                res.write(JSON.stringify(rdata));
                res.end();
                return;
            }
        }else{
            /*获取接口路由*/
            const apipath = apiPathFun(pathname);

            /*token不存在*/
            if(apipath === '/login/' || apipath === '/register/'){
                console.log('login&register');

                rdata = isCodeFun(201);


                res.writeHead(201, Heads)
                res.write(JSON.stringify(rdata));
                res.end();
                return;
            }else{
                /////*匹配状态码*/
                rdata = isCodeFun(403);

                rdata.data["msg"] = "请登录!"
                res.writeHead(403, Heads)
                res.write(JSON.stringify(rdata));
                res.end();
                return;
            }

        }


        if(req.headers['content-type']){
            if(req.headers['content-type'].match('x-www-form-urlencoded')){/*form表单模式*/
                // console.log(req);
                // 1.定义变量保存传递过来的参数
                let params = "";
                // 注意点: 在NODEJS中 ,POST请求的参数我们不能一次性拿到, 必须分批获取
                req.on("data", function (chunk) {
                    // 每次只能拿到一部分数据
                    params += chunk;
                });
                req.on("end", function () {
                    /////*新增所需参数*/
                    querys.h_datas = queryString.parse(params);
                    /////*新增需求数据*/
                    const fdata = postFun(pathname, querys)

                    /////*匹配状态码*/
                    isCodeFun(fdata.code)

                    /////*填充data中的数据*/
                    rdata.data = fdata.data;

                    /////*返回信息头,返回数据,结束请求*/
                    res.writeHead(fdata.code, Heads)
                    /////*返回数据*/
                    res.write(JSON.stringify(rdata));
                    res.end();
                });
            }else
            if(req.headers['content-type'].match('form-data')){ /*文件模式*/
                console.log('form-data');
                //////新建一个空数组接受文件流的信息
                let chunks=[];
                //获取长度
                let num=0;

                req.on("data",function(chunk){
                    chunks.push(chunk);
                    num+=chunk.length;
                });

                req.on("end",function(){
                    // console.log(chunks)
                    // console.log(num)
                    /*定义分割buffer的方法*/
                    let bufferSplit = (buffer, separator) => {
                        let result = [];
                        let index = 0;

                        while ((index = buffer.indexOf(separator)) !== -1) {
                            result.push(buffer.slice(0, index));
                            buffer = buffer.slice(index + separator.length);
                        }
                        result.push(buffer);

                        return result;
                    }

                    //最终流的内容本体
                    let buffer = Buffer.concat(chunks,num);
                    //获取分割字符串文件信息
                    const boundary = '--' + req.headers['content-type'].split('; ')[1].split('=')[1];

                    // 1. 用<分隔符boundary>切分数据
                    let bufArr = bufferSplit(buffer, boundary)
                    // 2. 删除数组头尾数据
                    bufArr.pop();    ///end
                    bufArr.shift();  ////start
                    // console.log(result.map(item => item.toString()))

                    // 3. 将每一项数据头尾的的\r\n删除
                    bufArr = bufArr.map(item => item.slice(2, item.length - 2))
                    // console.log(bufArr.map(item => item.toString()))

                    // 4. 将每一项数据中间的\r\n\r\n删除,得到最终结果
                    for(item of bufArr) {
                        // console.log(bufferSplit(item, '\r\n\r\n').map(item => item.toString()))

                        let [info, data] = bufferSplit(item, '\r\n\r\n')  // 数据中含有文件信息,保持为Buffer类型

                        info = info.toString()  // info为字段信息,这是字符串类型数据,直接转换成字符串,若为文件信息,则数据中含有一个回车符\r\n,可以据此判断数据为文件还是为普通数据。

                        if (info.indexOf('\r\n') >= 0) {  // 若为文件信息,则将Buffer转为文件保存
                            // 获取字段名
                            let infoResult = info.split('\r\n')[0].split('; ')
                            let name = infoResult[1].split('=')[1]
                            name = name.substring(1, name.length - 1)

                            // 获取文件名
                            let filename = infoResult[2].split('=')[1]
                            filename = filename.substring(1, filename.length - 1)
                            // console.log(name)    ////上传文件键名
                            // console.log(filename)    ////上传文件文件名
                            const newname = new Date().getTime() + '.' + filename.split('.').pop().toLowerCase();  ////时间戳重命名文件,避免中文
                            /*定义上传的文件夹名*/
                            const f_name = ['','files','']

                            /*上传目标路径及文件名*/
                            const address="." + f_name.join('/') + newname;

                            /*是否存在目标文件夹,不存在就创建*/
                            try{
                                fs.statSync(f_name[1]);
                                //如果可以执行到这里那么就表示存在了
                                console.log('存在');
                            }catch(e){
                                //捕获异常
                                console.log('不存在');
                                fs.mkdir(f_name[1],function(error){
                                    if(error){
                                        console.log(error);
                                        return false;
                                    }
                                    console.log('创建目录成功');
                                })
                            }

                            ///*将文件存储到服务器*/
                            fs.writeFile(address, data, err => {
                                if (err) {
                                    console.log(err)
                                } else {
                                    console.log('文件上传成功')
                                }
                            })
                            querys.h_files.push({
                                filename: filename,
                                url:f_name.join('/') + newname
                            })

                        } else {  // 若为数据,则直接获取字段名称和值
                            let name = info.split('; ')[1].split('=')[1]
                            name = name.substring(1, name.length - 1)
                            const value = data.toString()
                            // console.log(name, value)
                            querys.h_datas[name] =  value;
                        }
                    }

                    /////*新增需求数据*/
                    const fdata = postFun(pathname, querys)

                    /////*匹配状态码*/
                    rdata = isCodeFun(fdata.code)

                    /////*填充data中的数据*/
                    rdata.data = fdata.data;

                    /////*返回信息头,返回数据,结束请求*/
                    res.writeHead(fdata.code, Heads)
                    /////*返回数据*/
                    res.write(JSON.stringify(rdata));
                    res.end();

                });

            }else
            if(req.headers['content-type'].match('json')){ /*json或其他模式[在请求头中设定好](当前只处理json模式)*/
                console.log('json');
                // console.log(req)

                let params = "";
                // 注意点: 在NODEJS中 ,POST请求的参数我们不能一次性拿到, 必须分批获取
                req.on("data", function (chunk) {
                    // 每次只能拿到一部分数据
                    params += chunk;
                });
                req.on("end", function () {
                    /////*新增所需参数*/
                    querys.h_datas = JSON.parse(params);
                    /////*新增需求数据*/
                    const fdata = postFun(pathname, querys)

                    /////*匹配状态码*/
                    rdata = isCodeFun(fdata.code);

                    /////*填充data中的数据*/
                    rdata.data = fdata.data;

                    /////*返回信息头,返回数据,结束请求*/
                    res.writeHead(fdata.code, Heads)
                    /////*返回数据*/
                    res.write(JSON.stringify(rdata));
                    res.end();
                });

            }
        }

    }else{
        ////其他请求(可继续处理)
        ////没有匹配的状态码就单独处理或者新增
        rdata.status = {code:5005,msg:'暂不支持' + req.method + '方式'};    
        rdata.data = {};    

        res.writeHead(505, Heads)
        res.write(JSON.stringify(rdata));  
    }

});

// 3.指定监听的端口
server.listen(3000);






/*/////////////////////////////////////////////////////////////////////*/
/*所有路由*/
const routers = sallDatas.routers;

let f_data = {  ////定义返回上一级的数据
    code:200,
    data:{}
};
/*get方法统一管理*/
const getFun = (pathname,params) => {
    clearMdata();
    /*获取接口路由*/
    const apipath = apiPathFun(pathname);

    if(apipath === '/'){

        f_data.code = 200;
        f_data.data['lists'] = routers;

    }else
    if(apipath === '/user/') {      ////判断路由

        const users = require("./datafuns/users.js")

        const u_data = users.userGet(params);

        // console.log(u_data);

        f_data = u_data;

    }else {
        f_data.code = 400;
        f_data.data = { };
    }

    return f_data;
}
/*post方法统一管理*/
const postFun = (pathname,params) => {
    clearMdata();
    /*获取接口路由*/
    const apipath = apiPathFun(pathname);

    ////*统一管理用户权限*/
    if(params.h_datas.token){

    }

    if(apipath === '/user/') {      ////判断路由
        // console.log(params)
        const users = require("./datafuns/users.js")

        const u_data = users.userPost(params);

        // console.log(u_data);

        f_data = u_data;

    }else{
        f_data.code = 400;
        f_data.data = {};
    }


    return f_data;
}

//////*////////其他方法*/
/*匹配状态码*/
const isCodeFun = (code) => {
    let r_data = {}
    for(item in statusInfo) {
        if(String(item) === String(code)){
            r_data.status = statusInfo[item].status;
            r_data.data = {}
        }
    }

    return r_data;
}

/*路由切割*/
const apiPathFun = (path_name) => {
    const allpath = path_name.split('/');
    allpath.pop();

    allpath.push('')
    const apipath = allpath.join('/');


    return apipath;
}

/*重置模板数据*/
const clearMdata = () => {
    f_data = {  ////重置返回上一级的数据
        code:200,
        data:{}
    }
}

3.public_fun.js

/*公共写入读取数据的方法*/
const fs = require("fs");

const writeDataFun = (u_path,u_data) => {
    fs.readFile(u_path,function(err,data) {
        if (err) {
            return console.error(err);
        }
        let person = data.toString();  //将Buffer数据转换为字符串
        person = JSON.parse(person);  //将字符串转换为json对象
        person.push(u_data);  //将传来的对象push进数组对象中
        // console.log(person);
        const str = JSON.stringify(person);//因为nodejs的写入文件只认识字符串或者二进制数,所以把json对象转换成字符串重新写入json文件中
        fs.writeFile(u_path, str, function (err) {
            if(err){
                throw new Error("追加数据失败");
            }else{
                console.log("追加数据成功");

            }
        })
    })

    return 1;
}

const readDataFun = () => {

}

module.exports = {
    writeDataFun,
    readDataFun

}

4.user.js

const fs = require("fs");
const path = require("path");
const pub = require("./public_fun");

let udata = {
    code:200,
    data:{ }
}

/*数据路径*/
const u_path = path.join(__dirname, "/datas/users.json");

const userGet = (params) => {
    clearMdata();
    const d_users = readFun(u_path);

    if(params.h_datas.name || params.h_datas.age){    ////条件查询
        // console.log(d_users)


    }else{
        udata.code = 200;
        udata.data['total'] = d_users.length;
        udata.data['lists'] = d_users;
    }

    return udata;
}

const userPost = (params) => {
    clearMdata();
    // console.log(params);
    if(params.h_datas.name && params.h_datas.age) {
        // 0.组装存储的数据
        const u_data = {
            id: readFun(u_path).length + 1,
            name:params.h_datas.name,
            age:params.h_datas.age,
            font:params.h_files.length>0 ? params.h_files[0].url : "",
            type:'member',
        }
        const isAdd = pub.writeDataFun(u_path,u_data);
        // console.log(isAdd)
        if(isAdd){
            udata.code = 201;
            udata.data['user'] = u_data;
        }

    }else{
        udata.code = 400;
        udata.data = {};
    }


    return udata;
}

/*读取数据的方法*/
const readFun = (upath) => {
    const dusers = JSON.parse(fs.readFileSync(upath, "utf8"));
    return dusers;
}

/*清空模板数据*/
const clearMdata = () => {
    udata = {
        code:200,
        data:{ }
    }
}

module.exports = {
    userGet,
    userPost
}

5.sall_datas.js

/*定义一些固定数据模板*/

const statusInfo = {
    200:{
        statusCode:200,
        status:{code:2000,msg:'成功'},
    },
    201:{
        statusCode:201,
        status:{code:2001,msg:'添加成功'},
    },
    400:{
        statusCode:400,
        status:{code:4000,msg:'请求错误'},
    },
    403:{
        statusCode:403,
        status:{code:4003,msg:'状态失效'},
    },
    404:{
        statusCode:404,
        status:{code:4004,msg:'找不到'},
    },
    429:{
        statusCode:429,
        status:{code:4029,msg:'没有权限'},
    },
    500:{
        statusCode:500,
        status:{code:5005,msg:'服务器错误'},
    },
    502:{
        statusCode:502,
        status:{code:5002,msg:'服务器网络错误'},
    },
    503:{
        statusCode:503,
        status:{code:5003,msg:'服务器暂不可用'},
    }
}

const mineTypeMap =
    {
        ".323": "text/h323",
        ".3gp": "video/3gpp",
        ".aab": "application/x-authoware-bin",
        ".aam": "application/x-authoware-map",
        ".aas": "application/x-authoware-seg",
        ".acx": "application/internet-property-stream",
        ".ai": "application/postscript",
        ".aif": "audio/x-aiff",
        ".aifc": "audio/x-aiff",
        ".aiff": "audio/x-aiff",
        ".als": "audio/X-Alpha5",
        ".amc": "application/x-mpeg",
        ".ani": "application/octet-stream",
        ".apk": "application/vnd.android.package-archive",
        ".asc": "text/plain",
        ".asd": "application/astound",
        ".asf": "video/x-ms-asf",
        ".asn": "application/astound",
        ".asp": "application/x-asap",
        ".asr": "video/x-ms-asf",
        ".asx": "video/x-ms-asf",
        ".au": "audio/basic",
        ".avb": "application/octet-stream",
        ".avi": "video/x-msvideo",
        ".awb": "audio/amr-wb",
        ".axs": "application/olescript",
        ".bas": "text/plain",
        ".bcpio": "application/x-bcpio",
        ".bin ": "application/octet-stream",
        ".bld": "application/bld",
        ".bld2": "application/bld2",
        ".bmp": "image/bmp",
        ".bpk": "application/octet-stream",
        ".bz2": "application/x-bzip2",
        ".c": "text/plain",
        ".cal": "image/x-cals",
        ".cat": "application/vnd.ms-pkiseccat",
        ".ccn": "application/x-cnc",
        ".cco": "application/x-cocoa",
        ".cdf": "application/x-cdf",
        ".cer": "application/x-x509-ca-cert",
        ".cgi": "magnus-internal/cgi",
        ".chat": "application/x-chat",
        ".class": "application/octet-stream",
        ".clp": "application/x-msclip",
        ".cmx": "image/x-cmx",
        ".co": "application/x-cult3d-object",
        ".cod": "image/cis-cod",
        ".conf": "text/plain",
        ".cpio": "application/x-cpio",
        ".cpp": "text/plain",
        ".cpt": "application/mac-compactpro",
        ".crd": "application/x-mscardfile",
        ".crl": "application/pkix-crl",
        ".crt": "application/x-x509-ca-cert",
        ".csh": "application/x-csh",
        ".csm": "chemical/x-csml",
        ".csml": "chemical/x-csml",
        ".css": "text/css",
        ".cur": "application/octet-stream",
        ".dcm": "x-lml/x-evm",
        ".dcr": "application/x-director",
        ".dcx": "image/x-dcx",
        ".der": "application/x-x509-ca-cert",
        ".dhtml": "text/html",
        ".dir": "application/x-director",
        ".dll": "application/x-msdownload",
        ".dmg": "application/octet-stream",
        ".dms": "application/octet-stream",
        ".doc": "application/msword",
        ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
        ".dot": "application/msword",
        ".dvi": "application/x-dvi",
        ".dwf": "drawing/x-dwf",
        ".dwg": "application/x-autocad",
        ".dxf": "application/x-autocad",
        ".dxr": "application/x-director",
        ".ebk": "application/x-expandedbook",
        ".emb": "chemical/x-embl-dl-nucleotide",
        ".embl": "chemical/x-embl-dl-nucleotide",
        ".eps": "application/postscript",
        ".epub": "application/epub+zip",
        ".eri": "image/x-eri",
        ".es": "audio/echospeech",
        ".esl": "audio/echospeech",
        ".etc": "application/x-earthtime",
        ".etx": "text/x-setext",
        ".evm": "x-lml/x-evm",
        ".evy": "application/envoy",
        ".exe": "application/octet-stream",
        ".fh4": "image/x-freehand",
        ".fh5": "image/x-freehand",
        ".fhc": "image/x-freehand",
        ".fif": "application/fractals",
        ".flr": "x-world/x-vrml",
        ".flv": "flv-application/octet-stream",
        ".fm": "application/x-maker",
        ".fpx": "image/x-fpx",
        ".fvi": "video/isivideo",
        ".gau": "chemical/x-gaussian-input",
        ".gca": "application/x-gca-compressed",
        ".gdb": "x-lml/x-gdb",
        ".gif": "image/gif",
        ".gps": "application/x-gps",
        ".gtar": "application/x-gtar",
        ".gz": "application/x-gzip",
        ".h": "text/plain",
        ".hdf": "application/x-hdf",
        ".hdm": "text/x-hdml",
        ".hdml": "text/x-hdml",
        ".hlp": "application/winhlp",
        ".hqx": "application/mac-binhex40",
        ".hta": "application/hta",
        ".htc": "text/x-component",
        ".htm": "text/html",
        ".html": "text/html",
        ".hts": "text/html",
        ".htt": "text/webviewhtml",
        ".ice": "x-conference/x-cooltalk",
        ".ico": "image/x-icon",
        ".ief": "image/ief",
        ".ifm": "image/gif",
        ".ifs": "image/ifs",
        ".iii": "application/x-iphone",
        ".imy": "audio/melody",
        ".ins": "application/x-internet-signup",
        ".ips": "application/x-ipscript",
        ".ipx": "application/x-ipix",
        ".isp": "application/x-internet-signup",
        ".it": "audio/x-mod",
        ".itz": "audio/x-mod",
        ".ivr": "i-world/i-vrml",
        ".j2k": "image/j2k",
        ".jad": "text/vnd.sun.j2me.app-descriptor",
        ".jam": "application/x-jam",
        ".jar": "application/java-archive",
        ".java": "text/plain",
        ".jfif": "image/pipeg",
        ".jnlp": "application/x-java-jnlp-file",
        ".jpe": "image/jpeg",
        ".jpeg": "image/jpeg",
        ".jpg": "image/jpeg",
        ".jpz": "image/jpeg",
        ".js": "application/x-javascript",
        ".jwc": "application/jwc",
        ".kjx": "application/x-kjx",
        ".lak": "x-lml/x-lak",
        ".latex": "application/x-latex",
        ".lcc": "application/fastman",
        ".lcl": "application/x-digitalloca",
        ".lcr": "application/x-digitalloca",
        ".lgh": "application/lgh",
        ".lha": "application/octet-stream",
        ".lml": "x-lml/x-lml",
        ".lmlpack": "x-lml/x-lmlpack",
        ".log": "text/plain",
        ".lsf": "video/x-la-asf",
        ".lsx": "video/x-la-asf",
        ".lzh": "application/octet-stream",
        ".m13": "application/x-msmediaview",
        ".m14": "application/x-msmediaview",
        ".m15": "audio/x-mod",
        ".m3u": "audio/x-mpegurl",
        ".m3url": "audio/x-mpegurl",
        ".m4a": "audio/mp4a-latm",
        ".m4b": "audio/mp4a-latm",
        ".m4p": "audio/mp4a-latm",
        ".m4u": "video/vnd.mpegurl",
        ".m4v": "video/x-m4v",
        ".ma1": "audio/ma1",
        ".ma2": "audio/ma2",
        ".ma3": "audio/ma3",
        ".ma5": "audio/ma5",
        ".man": "application/x-troff-man",
        ".map": "magnus-internal/imagemap",
        ".mbd": "application/mbedlet",
        ".mct": "application/x-mascot",
        ".mdb": "application/x-msaccess",
        ".mdz": "audio/x-mod",
        ".me": "application/x-troff-me",
        ".mel": "text/x-vmel",
        ".mht": "message/rfc822",
        ".mhtml": "message/rfc822",
        ".mi": "application/x-mif",
        ".mid": "audio/mid",
        ".midi": "audio/midi",
        ".mif": "application/x-mif",
        ".mil": "image/x-cals",
        ".mio": "audio/x-mio",
        ".mmf": "application/x-skt-lbs",
        ".mng": "video/x-mng",
        ".mny": "application/x-msmoney",
        ".moc": "application/x-mocha",
        ".mocha": "application/x-mocha",
        ".mod": "audio/x-mod",
        ".mof": "application/x-yumekara",
        ".mol": "chemical/x-mdl-molfile",
        ".mop": "chemical/x-mopac-input",
        ".mov": "video/quicktime",
        ".movie": "video/x-sgi-movie",
        ".mp2": "video/mpeg",
        ".mp3": "audio/mpeg",
        ".mp4": "video/mp4",
        ".mpa": "video/mpeg",
        ".mpc": "application/vnd.mpohun.certificate",
        ".mpe": "video/mpeg",
        ".mpeg": "video/mpeg",
        ".mpg": "video/mpeg",
        ".mpg4": "video/mp4",
        ".mpga": "audio/mpeg",
        ".mpn": "application/vnd.mophun.application",
        ".mpp": "application/vnd.ms-project",
        ".mps": "application/x-mapserver",
        ".mpv2": "video/mpeg",
        ".mrl": "text/x-mrml",
        ".mrm": "application/x-mrm",
        ".ms": "application/x-troff-ms",
        ".msg": "application/vnd.ms-outlook",
        ".mts": "application/metastream",
        ".mtx": "application/metastream",
        ".mtz": "application/metastream",
        ".mvb": "application/x-msmediaview",
        ".mzv": "application/metastream",
        ".nar": "application/zip",
        ".nbmp": "image/nbmp",
        ".nc": "application/x-netcdf",
        ".ndb": "x-lml/x-ndb",
        ".ndwn": "application/ndwn",
        ".nif": "application/x-nif",
        ".nmz": "application/x-scream",
        ".nokia-op-logo": "image/vnd.nok-oplogo-color",
        ".npx": "application/x-netfpx",
        ".nsnd": "audio/nsnd",
        ".nva": "application/x-neva1",
        ".nws": "message/rfc822",
        ".oda": "application/oda",
        ".ogg": "audio/ogg",
        ".oom": "application/x-AtlasMate-Plugin",
        ".p10": "application/pkcs10",
        ".p12": "application/x-pkcs12",
        ".p7b": "application/x-pkcs7-certificates",
        ".p7c": "application/x-pkcs7-mime",
        ".p7m": "application/x-pkcs7-mime",
        ".p7r": "application/x-pkcs7-certreqresp",
        ".p7s": "application/x-pkcs7-signature",
        ".pac": "audio/x-pac",
        ".pae": "audio/x-epac",
        ".pan": "application/x-pan",
        ".pbm": "image/x-portable-bitmap",
        ".pcx": "image/x-pcx",
        ".pda": "image/x-pda",
        ".pdb": "chemical/x-pdb",
        ".pdf": "application/pdf",
        ".pfr": "application/font-tdpfr",
        ".pfx": "application/x-pkcs12",
        ".pgm": "image/x-portable-graymap",
        ".pict": "image/x-pict",
        ".pko": "application/ynd.ms-pkipko",
        ".pm": "application/x-perl",
        ".pma": "application/x-perfmon",
        ".pmc": "application/x-perfmon",
        ".pmd": "application/x-pmd",
        ".pml": "application/x-perfmon",
        ".pmr": "application/x-perfmon",
        ".pmw": "application/x-perfmon",
        ".png": "image/png",
        ".pnm": "image/x-portable-anymap",
        ".pnz": "image/png",
        ".pot,": "application/vnd.ms-powerpoint",
        ".ppm": "image/x-portable-pixmap",
        ".pps": "application/vnd.ms-powerpoint",
        ".ppt": "application/vnd.ms-powerpoint",
        ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
        ".pqf": "application/x-cprplayer",
        ".pqi": "application/cprplayer",
        ".prc": "application/x-prc",
        ".prf": "application/pics-rules",
        ".prop": "text/plain",
        ".proxy": "application/x-ns-proxy-autoconfig",
        ".ps": "application/postscript",
        ".ptlk": "application/listenup",
        ".pub": "application/x-mspublisher",
        ".pvx": "video/x-pv-pvx",
        ".qcp": "audio/vnd.qcelp",
        ".qt": "video/quicktime",
        ".qti": "image/x-quicktime",
        ".qtif": "image/x-quicktime",
        ".r3t": "text/vnd.rn-realtext3d",
        ".ra": "audio/x-pn-realaudio",
        ".ram": "audio/x-pn-realaudio",
        ".rar": "application/octet-stream",
        ".ras": "image/x-cmu-raster",
        ".rc": "text/plain",
        ".rdf": "application/rdf+xml",
        ".rf": "image/vnd.rn-realflash",
        ".rgb": "image/x-rgb",
        ".rlf": "application/x-richlink",
        ".rm": "audio/x-pn-realaudio",
        ".rmf": "audio/x-rmf",
        ".rmi": "audio/mid",
        ".rmm": "audio/x-pn-realaudio",
        ".rmvb": "audio/x-pn-realaudio",
        ".rnx": "application/vnd.rn-realplayer",
        ".roff": "application/x-troff",
        ".rp": "image/vnd.rn-realpix",
        ".rpm": "audio/x-pn-realaudio-plugin",
        ".rt": "text/vnd.rn-realtext",
        ".rte": "x-lml/x-gps",
        ".rtf": "application/rtf",
        ".rtg": "application/metastream",
        ".rtx": "text/richtext",
        ".rv": "video/vnd.rn-realvideo",
        ".rwc": "application/x-rogerwilco",
        ".s3m": "audio/x-mod",
        ".s3z": "audio/x-mod",
        ".sca": "application/x-supercard",
        ".scd": "application/x-msschedule",
        ".sct": "text/scriptlet",
        ".sdf": "application/e-score",
        ".sea": "application/x-stuffit",
        ".setpay": "application/set-payment-initiation",
        ".setreg": "application/set-registration-initiation",
        ".sgm": "text/x-sgml",
        ".sgml": "text/x-sgml",
        ".sh": "application/x-sh",
        ".shar": "application/x-shar",
        ".shtml": "magnus-internal/parsed-html",
        ".shw": "application/presentations",
        ".si6": "image/si6",
        ".si7": "image/vnd.stiwap.sis",
        ".si9": "image/vnd.lgtwap.sis",
        ".sis": "application/vnd.symbian.install",
        ".sit": "application/x-stuffit",
        ".skd": "application/x-Koan",
        ".skm": "application/x-Koan",
        ".skp": "application/x-Koan",
        ".skt": "application/x-Koan",
        ".slc": "application/x-salsa",
        ".smd": "audio/x-smd",
        ".smi": "application/smil",
        ".smil": "application/smil",
        ".smp": "application/studiom",
        ".smz": "audio/x-smd",
        ".snd": "audio/basic",
        ".spc": "application/x-pkcs7-certificates",
        ".spl": "application/futuresplash",
        ".spr": "application/x-sprite",
        ".sprite": "application/x-sprite",
        ".sdp": "application/sdp",
        ".spt": "application/x-spt",
        ".src": "application/x-wais-source",
        ".sst": "application/vnd.ms-pkicertstore",
        ".stk": "application/hyperstudio",
        ".stl": "application/vnd.ms-pkistl",
        ".stm": "text/html",
        ".svg": "image/svg+xml",
        ".sv4cpio": "application/x-sv4cpio",
        ".sv4crc": "application/x-sv4crc",
        ".svf": "image/vnd",
        ".svg": "image/svg+xml",
        ".svh": "image/svh",
        ".svr": "x-world/x-svr",
        ".swf": "application/x-shockwave-flash",
        ".swfl": "application/x-shockwave-flash",
        ".t": "application/x-troff",
        ".tad": "application/octet-stream",
        ".talk": "text/x-speech",
        ".tar": "application/x-tar",
        ".taz": "application/x-tar",
        ".tbp": "application/x-timbuktu",
        ".tbt": "application/x-timbuktu",
        ".tcl": "application/x-tcl",
        ".tex": "application/x-tex",
        ".texi": "application/x-texinfo",
        ".texinfo": "application/x-texinfo",
        ".tgz": "application/x-compressed",
        ".thm": "application/vnd.eri.thm",
        ".tif": "image/tiff",
        ".tiff": "image/tiff",
        ".tki": "application/x-tkined",
        ".tkined": "application/x-tkined",
        ".toc": "application/toc",
        ".toy": "image/toy",
        ".tr": "application/x-troff",
        ".trk": "x-lml/x-gps",
        ".trm": "application/x-msterminal",
        ".tsi": "audio/tsplayer",
        ".tsp": "application/dsptype",
        ".tsv": "text/tab-separated-values",
        ".ttf": "application/octet-stream",
        ".ttz": "application/t-time",
        ".txt": "text/plain",
        ".uls": "text/iuls",
        ".ult": "audio/x-mod",
        ".ustar": "application/x-ustar",
        ".uu": "application/x-uuencode",
        ".uue": "application/x-uuencode",
        ".vcd": "application/x-cdlink",
        ".vcf": "text/x-vcard",
        ".vdo": "video/vdo",
        ".vib": "audio/vib",
        ".viv": "video/vivo",
        ".vivo": "video/vivo",
        ".vmd": "application/vocaltec-media-desc",
        ".vmf": "application/vocaltec-media-file",
        ".vmi": "application/x-dreamcast-vms-info",
        ".vms": "application/x-dreamcast-vms",
        ".vox": "audio/voxware",
        ".vqe": "audio/x-twinvq-plugin",
        ".vqf": "audio/x-twinvq",
        ".vql": "audio/x-twinvq",
        ".vre": "x-world/x-vream",
        ".vrml": "x-world/x-vrml",
        ".vrt": "x-world/x-vrt",
        ".vrw": "x-world/x-vream",
        ".vts": "workbook/formulaone",
        ".wav": "audio/x-wav",
        ".wax": "audio/x-ms-wax",
        ".wbmp": "image/vnd.wap.wbmp",
        ".wcm": "application/vnd.ms-works",
        ".wdb": "application/vnd.ms-works",
        ".web": "application/vnd.xara",
        ".wi": "image/wavelet",
        ".wis": "application/x-InstallShield",
        ".wks": "application/vnd.ms-works",
        ".wm": "video/x-ms-wm",
        ".wma": "audio/x-ms-wma",
        ".wmd": "application/x-ms-wmd",
        ".wmf": "application/x-msmetafile",
        ".wml": "text/vnd.wap.wml",
        ".wmlc": "application/vnd.wap.wmlc",
        ".wmls": "text/vnd.wap.wmlscript",
        ".wmlsc": "application/vnd.wap.wmlscriptc",
        ".wmlscript": "text/vnd.wap.wmlscript",
        ".wmv": "audio/x-ms-wmv",
        ".wmx": "video/x-ms-wmx",
        ".wmz": "application/x-ms-wmz",
        ".wpng": "image/x-up-wpng",
        ".wps": "application/vnd.ms-works",
        ".wpt": "x-lml/x-gps",
        ".wri": "application/x-mswrite",
        ".wrl": "x-world/x-vrml",
        ".wrz": "x-world/x-vrml",
        ".ws": "text/vnd.wap.wmlscript",
        ".wsc": "application/vnd.wap.wmlscriptc",
        ".wv": "video/wavelet",
        ".wvx": "video/x-ms-wvx",
        ".wxl": "application/x-wxl",
        ".x-gzip": "application/x-gzip",
        ".xaf": "x-world/x-vrml",
        ".xar": "application/vnd.xara",
        ".xbm": "image/x-xbitmap",
        ".xdm": "application/x-xdma",
        ".xdma": "application/x-xdma",
        ".xdw": "application/vnd.fujixerox.docuworks",
        ".xht": "application/xhtml+xml",
        ".xhtm": "application/xhtml+xml",
        ".xhtml": "application/xhtml+xml",
        ".xla": "application/vnd.ms-excel",
        ".xlc": "application/vnd.ms-excel",
        ".xll": "application/x-excel",
        ".xlm": "application/vnd.ms-excel",
        ".xls": "application/vnd.ms-excel",
        ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        ".xlt": "application/vnd.ms-excel",
        ".xlw": "application/vnd.ms-excel",
        ".xm": "audio/x-mod",
        ".xml": "text/plain",
        ".xml": "application/xml",
        ".xmz": "audio/x-mod",
        ".xof": "x-world/x-vrml",
        ".xpi": "application/x-xpinstall",
        ".xpm": "image/x-xpixmap",
        ".xsit": "text/xml",
        ".xsl": "text/xml",
        ".xul": "text/xul",
        ".xwd": "image/x-xwindowdump",
        ".xyz": "chemical/x-pdb",
        ".yz1": "application/x-yz1",
        ".z": "application/x-compress",
        ".zac": "application/x-zaurus-zac",
        ".zip": "application/zip",
        ".json": "application/json"
    }
const routers = [
    {
        name:'/user/',
        url:'http://127.0.0.1:3000/user/',
        desc:{
            get:['','id=1','[page=1,page_size=20]','[type=admin]'],
            post:['name:i_mumu.fun,age:25,[font:a.jpg]'],
        }

    }
]

module.exports = {
    statusInfo,
    mineTypeMap,
    routers
}

相关文章

  • 原生Node搭建服务

    1.目录结构及说明 ---datafuns:处理各个接口的方法------datas:各个接口的数据文件-----...

  • Node创建服务器

    不学node的前端不是好流氓。 原生搭建简单文件服务器 代码分析 path.resolve([...paths])...

  • 01、搭建Node本地服务器

    一、搭建Node原生服务器 1.新建server.js文件,文件内容如下 2.打开cmd,找到server.js所...

  • 第四天 Nodejs 搭建web服务器

    Node.js 搭建web服务器 服务端脚本 1. Nodejs搭建web服务器响应html 2. Node.js...

  • [头参数]01 - 搭建服务器

    目录 使用node搭建http服务端 1. 使用node搭建http服务端 代码 response.end来返回数...

  • Node

    Node 检测Node是否安装成功 Node文件 自己搭建HTTP服务 创建http服务 监听端口 读取文件

  • Koa笔记

    先复习一下使用原生 Node.js 搭建一个 Web 服务器 可以看到,我们只需要关注 http.createSe...

  • 私有npm服务器搭建

    私有npm服务器搭建 标签(空格分隔): Node.js 私有npm服务器搭建 本次搭建是在ubuntu环境下搭建...

  • 搭建私有npm服务器教程

    私有npm服务器搭建 标签(空格分隔): Node.js 私有npm服务器搭建 本次搭建是在ubuntu环境下搭建...

  • 一、架构01-搭建日志服务器Rsyslog

    搭建日志服务器 1、环境配置 环境: node01 192.168.32.132 rsyslog服务器 node0...

网友评论

      本文标题:原生Node搭建服务

      本文链接:https://www.haomeiwen.com/subject/nbczohtx.html