Node.js之创建web服务器和HTTP请求与响应处理

Node.js之创建web服务器和HTTP请求与响应处理

1 创建web服务器

1.1 服务器端基础概念

网站应用程序主要分为两大部分:客户端和服务器端。

在这里插入图片描述
在开发阶段,客户端和服务器端使用同一台电脑,即开发人员电脑。
在这里插入图片描述
本机域名:localhost
本地IP :127.0.0.1

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

2 HTTP请求与响应处理

2.1 HTTP协议介绍

超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)规定了如何从网站服务器传输超文本到本地浏览器,它基于客户端服务器架构工作,是客户端(用户)和服务器端(网站)请求和应答的标准。

1.请求方式:

  • GET 请求数据
  • POST 发送数据

2.请求地址:

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

3.响应报文:

 app.on('request', (req, res) => {
     // 设置响应报文
     res.writeHead(200, {  'Content-Type': 'text/html;charset=utf8‘
     });
 });

其中HTTP状态码常见的有如下:

  • 200 请求成功
  • 404 请求的资源没有被找到
  • 500 服务器端错误
  • 400 客户端请求有语法错误

内容类型如下:

  • text/html
  • text/css
  • application/javascript
  • image/jpeg
  • application/json

2.2 GET与POST请求

1.GET请求
参数被放置在浏览器地址栏中,例如:http://localhost:3000/?name=zhangsan&age=20;
参数获取需要借助系统模块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);

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)); 
     }); 
 });

2.3 路由

路由是指客户端请求地址与服务器端程序代码的对应关系。简单的说,就是请求什么响应什么。
在这里插入图片描述

// 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('服务器启动成功')

2.4 静态资源与动态资源

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

相同的请求地址不同的响应资源,这种资源就是动态资源。
如:http://www.itcast.cn/article?id=1
http://www.itcast.cn/article?id=2

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('服务器启动成功')

3 Node.js异步编程

3.1 同步API与异步API

同步API从上到下依次执行,前面代码会阻塞后面代码的执行:

for (var i = 0; i < 100000; i++) { 
    console.log(i);
}
console.log('for循环后面的代码');

异步API不会等待API执行完成后再向下执行代码:

console.log('代码开始执行'); 
setTimeout(() => { console.log('2秒后执行的代码')}, 2000);
setTimeout(() => { console.log('"0秒"后执行的代码')}, 0); 
console.log('代码结束执行');

3.2 代码执行顺序分析

代码如下:

console.log('代码开始执行');
setTimeout(() => {
    console.log('2秒后执行的代码');
}, 2000); 
setTimeout(() => {
    console.log('"0秒"后执行的代码');
}, 0);
console.log('代码结束执行');

分析如下:
在这里插入图片描述

3.3 Promise

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

let promise = new Promise((resolve, reject) => {
    setTimeout(() => {
        if (true) {
            resolve({name: '张三'})
        }else {
            reject('失败了') 
        } 
    }, 2000);
});
promise.then(result => console.log(result); // {name: '张三'})
       .catch(error => console.log(error); // 失败了)

3.4 异步函数async关键字

  1. 普通函数定义前加async关键字普通函数变成异步函数;
  2. 异步函数默认返回promise对象;
  3. 在异步函数内部使用return关键字进行结果返回结果会被包裹的promise对象中 return关键字代替了resolve方法;
  4. 在异步函数内部使用throw关键字抛出程序异常;
  5. 调用异步函数再链式调用then方法获取异步函数执行结果;
  6. 调用异步函数再链式调用catch方法获取异步函数执行的错误信息。

3.5 异步函数await关键字

  1. await关键字只能出现在异步函数中;
  2. await promise await后面只能写promise对象写其他类型的API是不不可以的;
  3. await关键字可是暂停异步函数向下执行直到promise返回结果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,它允许开发者使用JavaScript语言进行服务器端编程。Node.js具有高效、轻量级和事件驱动的特点,适用于构建高性能的网络应用程序。 在Node.js中,可以使用各种模块和框架来进行Web服务器开发。以下是一些常用的模块和框架: 1. HTTP模块:Node.js内置的HTTP模块提供了创建HTTP服务器和客户端的功能。通过该模块,可以监听HTTP请求处理请求和发送响应。 2. Express框架:Express是一个流行的、灵活的Node.js Web应用程序框架。它提供了简化路由、中间件管理和模板引擎等功能,使得构建Web服务器变得更加容易。 3. Koa框架:Koa是一个新一代的Node.js Web框架,由Express团队开发。它使用了ES6的新特性,提供了更简洁、更强大的异步流程控制能力。 4. Socket.IO:Socket.IO是一个实时应用程序框架,可以在服务器和客户端之间建立双向通信。它基于WebSocket协议,并提供了跨浏览器的兼容性。 5. MongoDB:MongoDB是一个流行的NoSQL数据库,适用于存储和检索大量的非结构化数据。在Node.js中,可以使用Mongoose模块来连接和操作MongoDB数据库。 6. Sequelize:Sequelize是一个强大的ORM(Object-Relational Mapping)库,用于在Node.js中操作关系型数据库。它支持多种数据库,如MySQL、PostgreSQL和SQLite等。 以上只是一些常用的模块和框架,Node.js生态系统非常丰富,还有很多其他的模块和工具可供选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值