20181204-http模块搭建静态资源服务器

http 内置模块,主要是用于http服务

  • server-text.js 返回一段文本
/*
http.createServer((req,res)=>{}) 创建一个服务,传入一个监听函数
req是可读流,res是可写流;
res.end()调用res的end方法才能关闭流,返回响应
res.setHeader('Content-Type','text/plain;charset=utf8') 设置响应头指定文件类型和编码
server.listen(port)//开启服务在哪个端口
*/


let http = require('http');
let port = 3000;
let server = http.createServer((req,res)=>{//监听函数,当http请求到来时会执行此函数。
    //req 可读流,客户端传递过来的。
    //res 可写流,服务器返回客户端。
    
    //调用end,关闭可写流,才会结束响应把res返回到客户端
    //res.write('你好');会乱码,因为没有指定编码
    //res.end();
    
    //设置响应头content-type,指定编码和文件类型,否则返回中文,会乱码。
    res.setHeader('Content-Type','text/plain;charset=utf8')
    res.end('你好')
})

//服务器端口尽量使用3000+
server.listen(port,()=>{
    console.log(`${port} 服务启动`)
})

复制代码
  • server-html.js 返回一个html文件
let http = require('http')
let fs= require('fs')
let port = 3000;
http.createServer((req,res)=>{
    //响应头指定文件类型和编码,如果没有指定,浏览器可能也没有乱码因为html <meta charSet="UTF-8"> 生命了编码
    res.setHeader('Content-Type','text/html;charset=utf-8');
    //通过读取文件的方式
    fs.readFile('./index.html',(err,data)=>{
        res.end(data)  
    })
    //通过流的方式读取文件
    fs.createReadStream('./index.html').pipe(res);//pipe 方式内部自动调用了res.end
).listen(3000,()=>{
    console.log(`${port}服务启动`)
}

复制代码
  • server-url 根据请求req 的路径不同,返回不同内容(路由)
/*
url内置模块,处理url路径,解析成对象,pathname 是路径,query是?后面的参数;第二个参数传 true,代表把query由a=1&b=2转换为{a:1,b:2}
url.parse('www.baidu.com/a/index.html?a=1&b=2',true)=>{pathnam:'/a/index.html',quert:{a:1,b:2}} 


*/


let http = require('http');
let port = 3000;
let fs = require('fs');
let path = require('path');
//内置模块,处理url路径,解析成一个对象
let url = require('url');
// console.log(url.parse(
//     'http://user:password@www.html5train.com/viewer.do?courseId=1445662#currentPlaying=3431074',true)
// );//true 的作用 是将query "a=1&b=2"转换成一个对象

http.createServer((req,res)=>{
    //console.log(req.url)   //=> /index.html?a=1&b=2 
    let {pathname,query} = url.parse(req.url,true);//解析req.url,生成对象{pathname:'/index.html',query:{a:1,b:2}}
    
    路由:根据不同路径返回不同结果
    //1.如果访问的是文件,将文件读取返回
    //2.如果访问的是文件夹,默认去找你这个文件夹的index.html
    //3.不存在,返回404
    fs.stat(`.${pathname}`,(err,stats)=>{
        if(err){
            res.statusCode = 404;
            res.end(`${pathname} is not found`)
            return;
        }
        //如果是文件
        if(stats.isFile()){
            //todo 没有写content-type头
            fs.createReadStream('.${pathname}').pipe(res)
        }
        //如果是文件夹 ./也是文件夹
        if(stats.isDirectory()){
        
            let p = path.join(`.${pathname}`,'./index.html');
            fs.createReadStream(p).pipe(res)
        }
    })

}).listen(port,()=>{
    console.log(`${port} 服务开启`)
})


复制代码
  • server-mime.js 利用mime包设置cointent-type
let http = require('http');
let port = 3000;
let fs = require('fs');
let path = require('path');
let url = require('url');
//let mime = {
//    '.js':'application/javascript',
//    '.css':'text/css',
//    '.html':'text/html'
//}
let mime = require('mime');//npm install mime  利用第三方包处理mime类型
http.createServer((req,res)=>{
    let {pathname,query} = url.parse(req.url,true);
    fs.stat(`.${pathname}`,(err,stats)=>{
        if(err){
            res.statusCode = 404;
            res.end(`${pathname} is not found`)
            return;
        }
        //如果是文件
        if(stats.isFile()){
            // let extName = pathname.match(/\.\w+$/)[0];
            //res.setHeader('Content-Type',mime[extName]+';charset=utf-8')
            res.setHeader('Content-Type',mime.getType(pathname)+';charset=utf-8')
            fs.createReadStream('.${pathname}').pipe(res)
        }
        //如果是文件夹 ./也是文件夹
        if(stats.isDirectory()){
            res.setHeader('Content-Type','text/html;charset=utf-8')
            let p = path.join(`.${pathname}`,'./index.html');
            fs.createReadStream(p).pipe(res)
        }
    })

}).listen(port,()=>{
    console.log(`${port} 服务开启`)
})



复制代码
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值