美文网首页
2022-08-30 nodejs——创建web服务器

2022-08-30 nodejs——创建web服务器

作者: Lovevivi | 来源:发表于2024-02-14 21:06 被阅读0次
    // 用于创建网站服务器的模块
    const http = require('http')
    const url = require('url')
        // app对象就是网站服务器对象
    const app = http.createServer()
        // 当客户端又请求来的时候
    app.on('request', (req, res) => {
        res.writeHead(200, { 'content-type': 'text/html;charset=utf8' })
        url.parse(req.url)
        if (req.url == '/index') {
            res.end('首页')
        } else if (req.url == '/list') {
            res.end('list')
        }
    })
    app.listen(3000)
    console.log('服务器启动成功');
    

    在app.on里面

    req.headers // 获取请求报文
    req.url // 获取请求地址
    req.method // 获取请求方法

    响应报文

    http状态码

    res.writeHead(200,{'content-type': 'text/html';charset=utf8})
    

    在处理get请求参数的时候,url很长,就需要处理这个字符串,

    用到了系统内置模块url
    有一个parse方法

    url.parse(req.url,true).query.xxx // true是将查询参数解析成为对象形式
    url.parse(req.url,true).pathname // 除去get请求参数后的url
    

    post请求参数

    post参数是通过事件的方式接受的
    data 当请求参数传递的时候发出data事件
    end 当参数传递完成的时候发出end事件

    需要导入querystring,下面的parse方法能够把字符串转换为对象形式

    const querystring = require('querystring')
    let postParams = ' '
    
    // 淘汰的方式,应该转换为对象形式
    req.on('data', (params) => {
     // postParms += params // 这样得到的是一个和get上url一样的字符串
    })
    
    req.on('end'. () => {
      // log(postParams)
      log(querystring.parse(postParams))
    })
    
    res.end('ok')
    

    利用url.parse(req.url)得到一个不含参数的url,对这个url进行判断从而实现路由

    通过req.method获取请求的方式(是post还是get)


    image.png

    同步api和异步api(asnyc)

    异步api不可以通过返回值的方式获取返回值,需要用回调函数

    function getData (callback) {
      callback('123')
    }
    getData(() => {
      console.log('callback函数被调用了')
      console.log(n)
    })
    
    

    promise 解决异步编程中回调地狱问题

    首先是回调地狱图


    image.png

    promise用法

    const fs = require('fs')
    
    let promise = new Promise((resolve, reject) => {
        fs.readFile('./1.txt', 'utf-8', (err, result) => {
            if (err != null) {
                reject(err)
            } else {
                resolve(result)
            }
        })
    })
    
    promise.then((result) => {
        console.log(result);
    }).catch((err) => {
        console.log(err);
    })
    

    promise解决回调地狱

    const fs = require('fs')
    
    function p1() {
        return new Promise((resolve, reject) => {
            fs.readFile('./1.txt', 'utf-8', (err, result1) => {
                resolve(result1)
            })
        })
    }
    
    function p2() {
        return new Promise((resolve, reject) => {
            fs.readFile('./2.txt', 'utf-8', (err, result2) => {
                resolve(result2)
            })
        })
    }
    
    function p3() {
        return new Promise((resolve, reject) => {
            fs.readFile('./3.txt', 'utf-8', (err, result3) => {
                resolve(result3)
            })
        })
    }
    p1().then((r1) => {
        console.log(r1);
        return p2()
    }).then((r2) => {
        console.log(r2);
        return p3()
    }).then((r3) => {
        console.log((r3));
    })
    

    简化后的promise操作(es7)

    // 1.在普通函数定义的前面加上async关键字 普通函数就变成了异步函数
    // 2.异步函数默认的返回值是promise对象
    // 3.throw 抛出异常
    //
    // await关键字
    // 1.它只能出现在异步函数中
    // 2.await promise 它可以暂停异步函数的执行 等待promise对象返回结果后再向下执行函数
    async function fn() {
        throw '发生了一些错误'
        return 123
    }
    
    //console.log(fn());
    
    fn().then((data) => {
        console.log(data); // 拿到返回值
    }).catch((err) => {
        console.log(err);
    })
    

    接下来再来解决读取三个文件的例子

    // 1.在普通函数定义的前面加上async关键字 普通函数就变成了异步函数
    // 2.异步函数默认的返回值是promise对象
    // 3.throw 抛出异常
    //
    // await关键字
    // 1.它只能出现在异步函数中
    // 2.await promise 它可以暂停异步函数的执行 等待promise对象返回结果后再向下执行函数
    // 3.await等这次异步操作执行完之后再执行后面的操作,只能作用于promise对象
    const fs = require('fs')
    
    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()
    

    异步函数的应用(读取三个文件)

    const fs = require('fs')
    // 用来改造现有nodejs的异步api,让其返回promise对象从而支持异步编程语法
    const promisify = require('util').promisify
    const readFile = promisify(fs.readFile)
    async function run() {
        let r1 = await readFile('./1.txt', 'utf-8')
        let r2 = await readFile('./2.txt', 'utf-8')
        let r3 = await readFile('./3.txt', 'utf-8')
        console.log(r1);
        console.log(r2);
        console.log(r3);
    }
    run()
    

    相关文章

      网友评论

          本文标题:2022-08-30 nodejs——创建web服务器

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