http浅析

269 阅读2分钟

普通用法

const http = require('http');
// const Buffer = require('buffer');
const querystring = require('querystring');
const url = require('url');
// let s = url.parse('http://localhost:3000/abc?a=1&b=2');
// console.log(s);
//resful风格
// /user get/user post/user put/user delete
let server = http.createServer((req,res)=>{
    //req.url/headers/method req.on('data')
    //req.white end setHeader statusCode

    let {pathname,query} = url.parse(req.url,true);
    console.log(pathname,query);

    let method = req.method.toLowerCase();
    console.log(method);

    let headers = req.headers;
    console.log(headers);

    let arr = [];
    req.on('data',(chunk)=>{
        arr.push(chunk);
    });
    req.on('end',()=>{
        //a=1&b=2
        let str = Buffer.concat(arr).toString();
        if(req.headers['content-type']==='application/x-www-form-urlencoded'){
            let obj = querystring.parse(str);
            res.setHeader('Content-Type','application/json;charset=utf8')
            res.end(JSON.stringify(obj));
        }
    })
});
server.listen(3000);

处理静态文件

let http = require('http');
let querystring = require('querystring');
let url = require('url');
let fs = require('mz/fs');
let path = require('path');
let mime = require('mime'); //第三方模块
//一般服务端 会处理两种类型 静态的 html css
//动态数据 ajax 获取
// 路由 就是根据 不同的path 返回不同的内容


class Server{

    async handleRequest(req,res){
        let {pathname} = url.parse(req.url,true);
        let absPath = path.join(__dirname,pathname);
        //先判断是否是调用的接口  /user  get/post/delete/put
        let method = req.method.toLowerCase();
        //http 无状态的 cookie xss攻击
        let originList = [
            'http://127.0.0.1:63341',
            'http://127.0.0.1:63342',
            'http://127.0.0.1:63343',
        ]
        if(originList.includes(req.headers.origin)){
            res.setHeader('Access-Control-Allow-Origin',req.headers.origin);
        }
        res.setHeader('Access-Control-Allow-Methods','GET,PUT,DELETE,OPTIONS,POST');
        res.setHeader('Access-Control-Allow-Headers','Content-Type,token');
        res.setHeader('Access-Control-Max-Age','10');
        //允许前端带cookie
        res.setHeader('Access-Control-Allow-Credentials',true);
        if(method==='options'){
            res.end();
        }
        console.log(req.headers);
        switch(pathname){
            case '/userList':
                if(method === 'get'){
                    res.setHeader('Content-Type','application/json');
                    res.end(JSON.stringify({name:'zf'}));
                }
                if(method === 'put'){
                    res.setHeader('Content-Type','application/json');
                    res.end(JSON.stringify({name:'zf'}));
                }
            return;
        }


        try{
            let statObj = await fs.stat(absPath);
            if(statObj.isDirectory()){
                let realPath = path.join(absPath,'index.html');
                await fs.access(realPath);
                this.sendFile(realPath,res);
            }else{
                this.sendFile(absPath,res);
            }
        }catch(e){
            console.log(e);
            this.sendError(res,e);
        }
    }
    sendFile(absPath,res){
        res.setHeader('Content-Type',mime.getType(absPath));
        fs.createReadStream(absPath).pipe(res);
    }
    sendError(res,err){
        res.statusCode = 404;
        res.end('not found');
        return;
    }
    start(port){
        let server = http.createServer(this.handleRequest.bind(this));
        server.listen(port);
    }
}
let server = new Server();
server.start(3000);


// fs.stat(path.resolve(__dirname,'a'),function (err,statObj) {
//     console.log(err);
//     console.log(statObj.isDirectory())
// });

// let server = http.createServer((req,res)=>{
//     let {pathname} = url.parse(req.url,true);//   query a=1&b=2 {a:1,b:2}
//     let absPath = path.join(__dirname,pathname);//  /abc
//     fs.stat(absPath,(err,statObj)=>{
//         if(err){
//             res.statusCode = 404;
//             res.end('Not found');
//             return;
//         }
//         if(statObj.isFile()){
//             // /1.css =>text/css 1.png img/png
//             res.setHeader('Content-Type',mime.getType(absPath)+';charset=utf-8');
//             fs.createReadStream(absPath).pipe(res);
//             //readfile readstream.pipe
//         }else{
//             //如果是文件夹,就去文件夹下找 index.html
//             let realPath = path.join(absPath,'index.html');
//             fs.access(realPath,(err)=>{
//                 if(err){
//                     res.statusCode = 404;
//                     res.end('Not found');
//                     return;
//                 }
//                 res.setHeader('Content-Type','text/html;charset=utf-8');
//                 fs.createReadStream(realPath).pipe(res);
//             });
//         }
//     });
//     // if(statObj.isFile()){
//     //     fs.readFile(absPath,(err,data=>{
//     //
//     //     }))
//     // }
//     //fs.access 判断文件是否存在 fs.stat
//
// });
// server.listen(3000);