美文网首页
Node Web相关

Node Web相关

作者: 赫丹 | 来源:发表于2020-04-28 15:53 被阅读0次

    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')
    
    

    浏览器输入localhost:3000就可以访问了

    2.HTTP协议

    2.1请求方式(Request Method)(请求)
    • GET 请求数据
    • POST 发送数据
    2.2. 请求地址 (Request URL)(请求)
     app.on('request', (req, res) => {
         req.headers  // 获取请求报文
         req.url      // 获取请求地址
         req.method   // 获取请求方法
     });
    
    
    2.3.HTTP状态码(响应)
    • 200 请求成功
    • 404 请求的资源没有被找到
    • 500 服务器端错误
    • 400 客户端请求有语法错误
    2.4 内容类型(响应)
    • text/html
    • text/css
    • application/javascript
    • image/jpeg
    • application/json
     app.on('request', (req, res) => {
         // 设置响应报文
         res.writeHead(200, { 
      'Content-Type': 'text/html;charset=utf8‘
         });
     });
    
    

    3.HTTP请求与响应处理

    3.1GET请求参数
    • 参数被放置在浏览器地址栏中,例如:localhost:3000/?name=zhangsan&age=2
    • 参数获取需要借助系统模块url,url模块用来处理url地址
     const http = require('http');
     // 导入url系统模块 用于处理url地址
     const url = require('url');
     const app = http.createServer();
     app.on('request', (req, res) => {
         // 将url路径的各个部分解析出来并返回对象
             // true 代表将参数解析为对象格式
         let {query} = url.parse(req.url, true);
         console.log(query);
     });
     app.listen(3000);
    
    3.2 POST请求参数
    • 参数被放置在请求体中进行传输
    • 获取POST参数需要使用data事件和end事件
    • 使用querystring系统模块将参数转换为对象格式
    // 导入系统模块querystring 用于将HTTP参数转换为对象格式
     const querystring = require('querystring');
     app.on('request', (req, res) => {
         let postData = '';
         // 监听参数传输事件
         req.on('data', (chunk) => postData += chunk;);
         // 监听参数传输完毕事件
         req.on('end', () => { 
             console.log(querystring.parse(postData)); 
         }); 
     });
    
    

    4.路由

    • localhost:3000/index
    • localhost:3000/login
    • 路由是指客户端请求地址与服务器端程序代码的对应关系。简单的说,就是请求什么响应什么
     // 当客户端发来请求的时候
    // 1.引入系统模块http
    // 2.创建网站服务器
    // 3.为网站服务器对象添加请求事件
    // 4.实现路由功能
    //  1.获取客户端的请求方式
    //  2.获取客户端的请求地址
    const http = require('http');
    const url = require('url');
    const app = http.createServer();
    app.on('request', (req, res) => {
        //请求方式转换小写
        const method = req.method.toLowerCase();
        //获取请求地址
        const pathname = url.parse(req.url).pathname;
        res.writeHead(200, {
            'content-type': 'text/html;charset=utf8'
        });
        if (method == 'get') {
            if (pathname == '/' || pathname == '/index') {
                res.end('欢迎来到首页');
            } else if (pathname == '/list') {
                res.end('欢迎来到列表页');
    
            } else {
                res.end('你访问的页面找不到');
            }
        } else if (method == 'post') {
        }
    });
    //监听端口
    app.listen(3000);
    console.log('服务器启动成功')
    

    5.静态资源(mime模块)

    mime模块用来获取请求url相关的内容类型

    const http = require('http');
    const url = require('url');
    const path = require('path');
    const fs = require('fs');
    const mime = require('mime');
    const app = http.createServer();
    app.on('request', (req, res) => {
        // 获取用户的请求路径
        let pathname = url.parse(req.url).pathname;
        pathname = pathname == '/' ? '/default.html' : pathname;
        // 将用户的请求路径转换为实际的服务器硬盘路径
        let realPath = path.join(__dirname, 'public' + pathname);
        let type = mime.getType(realPath)
        // 读取文件
        fs.readFile(realPath, (error, result) => {
            // 如果文件读取失败
            if (error != null) {
                res.writeHead(404, {
                    'content-type': 'text/html;charset=utf8'
                })
                res.end('文件读取失败');
                return;
            }
            res.writeHead(200, {
                'content-type': type
            })
            res.end(result);
        });
    });
    app.listen(3000);
    console.log('服务器启动成功')
    

    6.异步编程

    6.1 Promise

    Promise出现的目的是解决Node.js异步编程中回调地狱的问题
    示例1

    const fs = require('fs');
    let promise = new Promise((resole, reject) => {
        fs.readFile('./100.txt', 'utf8', (err, result) => {
            if (err != null) {
                reject(err);
            } else {
                resole(result);
            }
        })
    });
    promise.then(result => {
        //读取成功
        console.log(result);
    }).catch(err => {
        //读取失败
        console.log(err)
    })
    

    示例2 回调地狱

    const fs = require('fs');
    // fs.readFile('./1.txt', 'utf8', (err, result1) => {
    //     console.log('读取成功'+result1);
    //     fs.readFile('./2.txt', 'utf8', (err, result2) => {
    //         console.log('读取成功'+result2);
    //         fs.readFile('./3.txt', 'utf8', (err, result3) => {
    //             console.log('读取成功'+result3);
    //         })
    //     })
    // })
    function p1() {
        return new Promise((resole, reject) => {
            fs.readFile('./1.txt', 'utf8', (err, result) => {
                if (err != null) {
                    reject(err);
                } else {
                    resole(result);
                }
            })
        })
    }
    function p2() {
        return new Promise((resole, reject) => {
            fs.readFile('./2.txt', 'utf8', (err, result) => {
                if (err != null) {
                    reject(err);
                } else {
                    resole(result);
                }
            })
        })
    }
    function p3() {
        return new Promise((resole, reject) => {
            fs.readFile('./3.txt', 'utf8', (err, result) => {
                if (err != null) {
                    reject(err);
                } else {
                    resole(result);
                }
            })
        })
    }
    p1().then(rs1 => {
        console.log(rs1);
        return p2();
    }).then(rs2 => {
        console.log(rs2)
        return p3();
    }).then(rs3 => {
        console.log(rs3);
    })
    
    6.2异步函数

    异步函数是异步编程语法的终极解决方案,它可以让我们将异步代码写成同步的形式,让代码不再有回调函数嵌套,使代码变得清晰明了。

    const fn = async () => {};
    async function fn () {};
    
    async关键字
    1. 普通函数定义前加async关键字 普通函数变成异步函数
    2. 异步函数默认返回promise对象
    3. 在异步函数内部使用return关键字进行结果返回 结果会被包裹的promise对象中 return关键字代替了resolve方法
    4. 在异步函数内部使用throw关键字抛出程序异常
    5. 调用异步函数再链式调用then方法获取异步函数执行结果
    6. 调用异步函数再链式调用catch方法获取异步函数执行的错误信息
    await关键字
    1. await关键字只能出现在异步函数中
    2. await promise await后面只能写promise对象 写其他类型的API是不不可以的
    3. await关键字可是暂停异步函数向下执行 直到promise返回结果
    // 1.在普通函数定义的前面加上async关键字 普通函数就变成了异步函数
    // 2.异步函数默认的返回值是promise对象
    // 3.在异步函数内部使用throw关键字进行错误的抛出
    // await关键字
    // 1.它只能出现在异步函数中
    // 2.await promise 它可以暂停异步函数的执行 等待promise对象返回结果后再向下执行函数
    // async function fn() {
    //     throw '发生了一些错误';
    //     return 123;
    // }
    // console.log(fn());
    // fn().then(function (data) {
    //     console.log(data);
    // }).catch(err=>{
    //     console.log(err);
    // })
    async function p1() {
        return 'p1'
    }
    async function p2() {
        return 'p2'
    }
    async function p3() {
        return 'p3'
    }
    async function run() {
        let r1 = await p1();
        let r2 = await p2();
        let r3 = await p3();
        console.log(r1);
        console.log(r2);
        console.log(r3);
    }
    run();
    
    asyncfunctionReadfile
    const fs = require('fs');
    // 改造现有异步函数api 让其返回promise对象 从而支持异步函数语法
    const promisify = require('util').promisify;
    // 调用promisify方法改造现有异步API 让其返回promise对象
    const readFile = promisify(fs.readFile);
    async function run () {
        let r1 = await readFile('./1.txt', 'utf8')
        let r2 = await readFile('./2.txt', 'utf8')
        let r3 = await readFile('./3.txt', 'utf8')
        console.log(r1)
        console.log(r2)
        console.log(r3)
    }
    run();
    

    相关文章

      网友评论

          本文标题:Node Web相关

          本文链接:https://www.haomeiwen.com/subject/ddwvwhtx.html