node学习之http(二)使用例子篇

640 阅读2分钟

1、使用http模块开始生成例子

let http = require('http');
let port = 3000;
http.createServer((req,res)=>{ 
//监听函数,当请求到来时会执行回调函数
    //req 代表是客户端,他是一个可读流
    //res 代表是服务端,他是一个可写流
    res.setHeader('Content-Type','text/plain;charset=utf8')
    res.write("女孩");
    res.end(); 
// 调用end后结束响应}).listen(port,()=>{
    console.log(`服务器已经启动在${port}上`)
});
//端口号尽量使用3000以上的端口号

2、在基础上加载一个html文件

let http = require('http');
let port = 3000;
let fs = require('fs');
http.createServer((req,res)=>{ //监听函数,当请求到来时会执行回调函数
    //req 代表是客户端,他是一个可读流
    //res 代表是服务端,他是一个可写流
//    fs.readFile('index.html',function(err,data){
//        res.end(data)
//    })
  res.setHeader('Content-Type','text/html;charset=utf-8')
  fs.createReadStream('index.html').pipe(res)
}).listen(port,()=>{
    console.log(`服务器已经启动在${port}上`)
});
//端口号尽量使用3000以上的端口号

同样,这样子的方法你会发现问题,就是每次请求都会返回html

使用第三步需要加载出css文件,需要动态请求

达到的需求是这样子:

  • 根据不同的路径返回不同的内容
  • 如果访问的是/ 显示主页index.html
  • 如果访问文件,讲文件读取返回
  • 如果是文件夹, 默认index.html
  • 文件不存在返回404

代码实现

let http = require('http');
let port = 3000;
let fs = require('fs');
let path = require('path')
let url = require('url'); // 把一个路径解析成一个对象 
http.createServer((req,res)=>{ //监听函数,当请求到来时会执行回调函数
    //根据不同的路径返回不同的内容
    //如果访问的是/  显示主页index.html
    //如果访问文件,讲文件读取返回
    //如果是文件夹, 默认index.html
    //文件不存在返回404
    let {pathname,query} = url.parse(req.url,true);
    fs.stat('.'+pathname,function(err,stats){
        // console.log(err,"错误",pathname)
        if(err){
            res.statusCode = 404;
            res.end(`${pathname} not found`)
        }else if(stats.isFile()){
            fs.createReadStream('.'+pathname).pipe(res);
        }else if(stats.isDirectory()){
            // console.log('.'+pathname)
            res.setHeader('Content-Type','text/html;charset=utf-8')
            let p = path.join('.'+pathname,'index.html');
            fs.createReadStream(p).pipe(res)
        }

    })
//   res.setHeader('Content-Type','text/html;charset=utf-8')
//   fs.createReadStream('index.html').pipe(res)
}).listen(port,()=>{
    console.log(`服务器已经启动在${port}上`)
});
//端口号尽量使用3000以上的端口号

可以实现访问.css不同类型的文件,默认index.html文件

访问错误时显示提示;'

访问目录默认index.html文件

到这里还有个问题,那就是编码头问题

编码头都我说我写定的:

res.setHeader('Content-Type','text/html;charset=utf-8')

或者是html类型写好的:

<meta charset="UTF-8">

现在我们需要动态添加头

使它如果是:

'.js':'application/javascript',

'.css':'text/css',

'.html':'text/html',

这样子的Content-Type

初步写法:

这样子写的问题比较不行,很多文件类型

node有个mime模块可以帮助我们解决这个问题

安装过程和方法:

let http = require('http');
let port = 3000;
let fs = require('fs');
let path = require('path')
let url = require('url'); // 把一个路径解析成一个对象 
const mime = require('mime');
http.createServer((req,res)=>{ //监听函数,当请求到来时会执行回调函数
    let {pathname,query} = url.parse(req.url,true);
    fs.stat('.'+pathname,function(err,stats){
        if(err){
            res.statusCode = 404;
            res.end(`${pathname} not found`)
        }else if(stats.isFile()){
           console.log(mime.getType(pathname),pathname)
            res.setHeader('Content-Type',mime.getType(pathname)+';charset=utf-8')
            fs.createReadStream('.'+pathname).pipe(res);
        }else 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}上`)
});

最终实现代码。

有问题请大佬们指出。