随手笔记16-node搭建服务器和一些常见的模块

一、http模块

1. 服务器搭建

创建web服务器

  // 引用系统模块
 const http = require('http');
  // 创建web服务器
 const app = http.createServer();
  // 当客户端发送请求的时候
 app.on('request', (req, res) => {
        //  响应
       res.end('<h1>hi, user</h1>');
 });
  // 监听3000端口
 app.listen(3000);
 console.log('服务器已启动,监听3000端口,请访问 localhost:3000')

req: request对象,包含了所有的请求信息
res: response对象,包含了响应信息
在这里插入图片描述

2. 请求对象

request对象 包含了所有与请求相关的信息
url: 端口后的所有内容 :资源路径、查询字符串…
method: 请求方式

  • 请求地址
 app.on('request', (req, res) => {
     req.headers  // 获取请求报文
     req.url      // 获取请求地址
     req.method   // 获取请求方法
 });

3. 响应对象

  1. HTTP状态码
    • 200 请求成功
    • 404 请求的资源没有被找到
    • 500 服务器端错误
    • 400 客户端请求有语法错误
  2. MIME类型
    • text/html
    • text/css
    • application/javascript
    • image/jpeg
    • application/json
 app.on('request', (req, res) => {
     // 设置响应报文
     res.writeHead(200, {'Content-Type': 'text/html;charset=utf8'});
     res.setHeader('Content-Type', 'text/html;charset=utf8');
     //以上两种方式都可以设置响应报文
 });

4. 路由

路由是指客户端请求地址与服务器端程序代码的对应关系。简单的说,就是请求什么响应什么。
比如:
http://localhost:3000/index
http://localhost:3000/login

在这里插入图片描述

 // 当客户端发来请求的时候
 app.on('request', (req, res) => {
     // 获取客户端的请求路径
     let { pathname } = url.parse(req.url);
     if (pathname == '/' || pathname == '/index') {
         res.end('欢迎来到首页');
     } else if (pathname == '/list') {
         res.end('欢迎来到列表页页');
     } else {
        res.end('抱歉, 您访问的页面出游了');
     }
 });

5. get和post请求

由于get和post请求的数据提交方式是不一样的,
get:在地址中提交数据
post:请求体中提交数据

后端通过request.mehtod属性来判断是哪种请求,在解析两种请求的时候方案也是不一致的
get: 在请求对象的属性中直接获取(res.url)
post: 需要通过事件监听机制来完成数据的接收,监听 data和end事件

6.静态资源和动态资源

静态资源: 服务器端不需要处理,可以直接响应给客户端的资源就是静态资源,例如CSS、JavaScript、image文件。

动态资源:相同的请求地址不同的响应资源,这种资源就是动态资源。

静态资源的处理,其实和路由的配置非常相似,只不过静态资源都有指定的目录和特殊的后缀,简单处理如下:
也可以使用第三方插件mime,使用npm install mime 安装
其中有个getType(path),返回mime类型

let ext = path.extname(req.url); //获取请求路径的后缀
    let basename = path.basename(req.url); //获取路径中文件的名称

    switch (ext) {
        case ".css":
            buf = fs.readFileSync(`./public/css/${basename}`);
            break;
        case ".js":
            buf = fs.readFileSync(`./public/js/${basename}`);
            break;
        case ".jpg":
        case ".png":
        case ".gif":
        case ".bmp":
            buf = fs.readFileSync(`./public/image/${basename}`);
            break;
}

二、url模块

将请求字符串抓换为对象

let obj=url.parse(str);//将请求字符串转换为对象
let obj=url.parse(str,true);//参数二为true ,将查询字符串转换为对象querystring
console.log(obj.protocol);//协议
console.log(obj.hostname);//主机名
console.log(obj.port);//端口号
console.log(obj.pathname);//资源路径
console.log(obj.query);//查询字符串
let {username,pwd}=url.parse(str,true).query;

// console.log(obj);
console.log(username,pwd);
  • querystring模块

将查询字符串---->对象

//查询字符串
let str='uername=jack&pwd=123';
let obj=qs.parse(str);

三、path模块

方法描述
join(path1,path2)拼接路径
extname(path)获取路径后缀名e:.js、.css …
basename(path)获取最后一个文件或者目录
dirname获取上一级目录
isAbsoute(path)判断是否为绝对路径 是为true
resolve(path)把相对路径转化为绝对路径

四、fs模块(文件模块)

方法描述
mkdir(path,call)只能创建单层目录,不能嵌套
rmdir(path)删除单层空文件夹
readdir(path,callback)读取文件,返回一个数组
exists(path)判断路径是否存在
stat(path,callback)用于读取文件的状态

关于stat用法详细介绍

/*
 callback有两个参数;err,stats;stats是一个fs.Stats对象;如果发生错误err.code是常见错误之一;
 不建议在调用 fs.open() 、fs.readFile() 或 fs.writeFile() 之前使用 fs.stat() 检查一个文件是否存在。 作为替代,用户代码应该直接打开/读取/写入文件,当文件无效时再处理错误。
 如果要检查一个文件是否存在且不操作它,推荐使用 fs.access()。
 */
fs.stat("./wenjian.txt",function(err,stats){
    console.log(err);
    console.log(stats);
//    获取文件的大小;
    console.log(stats.size);
//    获取文件最后一次访问的时间;
    console.log(stats.atime.toLocaleString());
//    文件创建的时间;
    console.log(stats.birthtime.toLocaleString());
//    文件最后一次修改时间;
    console.log(stats.mtime.toLocaleString());
//    状态发生变化的时间;
    console.log(stats.ctime.toLocaleString())
//判断是否是目录;是返回true;不是返回false;
    console.log(stats.isFile())
//    判断是否是文件;是返回true、不是返回false;
    console.log(stats.isDirectory())
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页