美文网首页
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()

相关文章

  • 与服务器通讯

    与服务器通讯 创建web服务器,使用nodejs创建服务器,创建server文件夹,在这个文件夹中使用npm命令初...

  • nodejs创建web服务器

    这样是返回不了内容的,不知道为啥子 对比下,这种写法才行 这样写是会报错的,先执行了end,再执行write 这样...

  • 使用nodejs实现web服务器与客户端的交互

    使用nodejs实现web服务器与客户端的交互 使用nodejs实现web服务器与客户端的交互 1.实验目的: 使...

  • 02 - 基于NodeJS搭建一个 Web 服务器

    基于NodeJS搭建一个 Web 服务器

  • 2018-11-29

    手把手带你NodeJs入门(一) http 创建服务器 创建一个简单的服务器,在nodejs中创建一个server...

  • nodejs大纲

    nodejs大纲 目录 nodejs是什么 使用nodejs创建一个服务器(接口) nodejs的模块系统 nod...

  • 2019-11-22

    Nodejs支持全部的服务器代码。包括web服务器和服务器端的脚本和任何支持web应用程序的功能。web服务器和任...

  • 你所知道的node.js

    目录 nodejs是什么 使用nodejs创建一个服务器(接口) nodejs的模块系统 nodejs文件系统 路...

  • 使用 node 创建基本的 web 服务器

    1. 创建 web 服务器的基本步骤 ① 导入 http 模块 ② 创建 web 服务器实例 ③ 为服务器实例绑定...

  • 使用vscode调试nodejs+typescript+expr

    前言 项目是 TS+Nodejs+Express构建用于前端调试的WEB服务器 基本环境 nodejs vscod...

网友评论

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

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