http 内置模块,主要是用于http服务
/*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 生命了编码 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} 服务开启`)})复制代码