ndoe中express框架的基本使用,接收get、post请求,以及处理回调地狱的优雅解决方法

news2024/11/13 18:42:46

一、express框架的基本使用

Express框架是Node.js中最受欢迎的web开发框架,它的设计简洁而且功能强大,有着大量的插件和社区支持。

基于Express使用Node.js创建web应用的基本步骤如下:

  1. 首先你需要安装Node.js和npm(Node包管理器),然后在你的项目文件夹中安装Express:
npm install express --save
  1. 然后在项目中创建一个JavaScript文件,比如app.js,并且在文件中导入Express:
var express = require('express');
var app = express();
  1. 使用app对象的get方法,对某个URL路径进行路由处理:
app.get('/', function (req, res) {
    res.send('Hello World!');
});

这个代码表示当客户端向服务器发起一个HTTP GET请求,请求的URL路径为“/”时,服务器会响应一个“Hello World!”的消息。

  1. 使用app对象的listen方法,让服务器开始监听某个端口:
app.listen(3000, function () {
    console.log('Example app listening on port 3000!');
});

这个代码表示服务器会在3000端口监听请求。

  1. 运行这个Node.js应用:
node app.js

然后你可以打开浏览器或者用postman等工具访问 http://localhost:3000,就会看到显示的“Hello World!”消息。
在这里插入图片描述

完整代码如下:

// 引入express
var express = require('express');

// 创建express实例
var app = express();

app.get('/', function (req, res) {
    res.send('Hello World!');
});

// 监听3000端口
app.listen(3000, function () {
    console.log('app is listening at port 3000');
    console.log('http://localhost:3000');
});

Express还有很多高级特性,比如可以方便地解析请求参数、处理POST请求、使用模板引擎生成动态HTML页面、使用中间件进行统一处理等等。

二、解析get/post请求

1. 接收get请求参数

如果我们要接收GET请求的参数,我们可以通过req.query对象来获取。比如有一个GET请求参数是http://localhost:3000/?name=John,我们就可以通过以下方式获取到参数name的值:

app.get('/', (req, res) => {
  let name = req.query.name;
  res.send(`Hello ${name}`);
});

在这里,当用户访问http://localhost:3000/?name=John时,应用将会返回字符串"Hello John"。
在这里插入图片描述

2. 接收post请求参数

在node.js中,我们通常使用Express框架来处理HTTP请求。对于POST请求,Express提供了专门的API。下面是一个基本示例:

const express = require('express');
const bodyParser = require('body-parser');
const app = express();

app.use(bodyParser.json()); // 在请求处理之前,先解析JSON

app.post('/example', (req, res) => {
  console.log(req.body); // 打印输出请求的JSON数据
  res.send('Post request received');
});

app.listen(3000, () => console.log('Server started on port 3000'));

以上代码创建了一个Express服务器,并监听3000端口,然后使用body-parser中间件来解析JSON格式的POST请求。bodyParser.json()返回的是一个用于处理HTTP请求的函数,每当有新的请求过来,这个函数就会被调用,它会读取请求体中的JSON数据,然后放到req.body中。

/example路径接收到POST请求时,Express会执行对应的回调函数,打印出解析后的JSON数据,然后将Post request received返回给客户端。

如果你想接收不同格式的POST请求参数,比如从表单提交的数据,你需要使用不同的body-parser解析器。例如,可以使用bodyParser.urlencoded()解析"application/x-www-form-urlencoded" 格式的数据:

app.use(bodyParser.urlencoded({ extended: true }));

extended选项设置为true意味着用更复杂的库(querystring库)来解析URL编码的数据,这样可以解析更复杂的对象、嵌套对象等等。

如果POST请求发送的是纯文本或其他格式,可以使用bodyParser.text()bodyParser.raw()来处理。

总的来说,body-parser中间件提供了一系列方法来解析不同格式的POST请求数据,根据你的需要选择使用即可。

请注意,Express 4.16.0增加了一些内置的中间件,所以对于基本的json和urlencoded解析,你可以不用body-parser

app.use(express.json())
app.use(express.urlencoded({ extended: true }))

例如:

// 引入express
const express = require('express');

// 创建express实例
const app = express();
app.use(express.json())
app.use(express.urlencoded({ extended: true }))

app.get('/', (req, res) => {
    let name = req.query.name;
    res.send(`Hello ${name}`);
});

app.post('/', (req, res) => {  
    let user = req.body;
    res.send(user);
});

// 监听3000端口
app.listen(3000, function () {
    console.log('app is listening at port 3000');
    console.log('http://localhost:3000');
});

  • application/x-www-form-urlencoded
    在这里插入图片描述

  • application/json
    在这里插入图片描述
    在这里插入图片描述

三、处理回调地狱问题

1. 内置模块util介绍

util是Node.js的核心模块之一,在Node中,可通过 require('util') 命令将其引入。

util模块主要用于支持Node.js核心API的需要,尽管一些实用函数可供应用程序和其它模块使用。以下是util模块中一些常用的函数:

  • util.debuglog : 创建一个函数,基于NODE_DEBUG环境变量,用于创建一个条件性的调试器。
  • util.deprecate : 将一个函数包装成废弃函数。
  • util.format : 返回一个格式化的字符串。
  • util.inherits : 实现对象间原型继承的函数。
  • util.inspect : 将任意对象转换为字符串,通常用于调试和错误输出。
  • util.isArray :如果给定的参数 “object” 是一个数组返回true,否则返回false。
  • util.isDate : 如果给定的参数 “object” 是一个日期返回true,否则返回false。
  • util.isError : 如果给定的参数 “object” 是一个错误对象返回true,否则返回false。
  • util.isRegExp : 如果给定的参数 “object” 是一个正则表达式返回true,否则返回false。

注意,在Node.js v10.0.0中,一些函数(例如 util.isError, util.isDate等)已经被废弃,建议使用更标准的JavaScript内置API,如 Array.isArrayinstanceof Date 等来替换。

2. promisify的使用

util.promisify 是 Node.js 的内置模块中的一个方法,它主要把一个遵循通用错误优先的回调风格的函数(即最后一个参数是一个 (err, value) => ... 回调)转换成一个返回 promise 的函数。

示例如下:

const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);

readFile('/some/file')
  .then(data => {
    console.log(data);
  })
  .catch(err => {
    console.log(err);
  });

在这个示例中,fs.readFile 是一个典型的 Node.js 回调风格的函数,它的最后一个参数为回调函数,回调函数的第一个参数为可能出现的错误,第二个参数为函数的返回值。

通过 util.promisify,我们将它转换成了一个返回 promise 的函数。这样,我们就可以使用 .then.catch 来处理函数的返回值和可能出现的错误,而不需要通过回调函数的方式。这通常可以让代码更加简洁,逻辑更清晰。

实际应用场景

在实际编程中,比如你正在使用一款第三方库,而这个第三方库的 API 是 callback 风格的。你想在 async/await 的语境下使用这个 API。那么,util.promisify 就可以帮助你将这个 API 转换成 Promise 风格,从而可以在 async/await 中使用。

例如:

const util = require('util');
const request = require('request');

const requestPromise = util.promisify(request);

async function main() {
  const { body } = await requestPromise('https://example.com');
  console.log(body); // 请求返回的 HTML
}

main();

在这个例子中,request 函数源自一个 HTTP 请求库,该函数符合错误优先回调风格。通过 util.promisify,我们将 request 函数转换成返回 promise 的函数,然后在 async/await 的上下文中使用它。这使我们能以同步的方式编写异步代码,使处理异步代码变得更简单。

四、HTTP响应状态码介绍

HTTP响应状态码,或HTTP状态码,是服务器在响应HTTP请求时返回的一个3位数字代码,用于表示服务器处理请求的结果。这些代码被分类为五种类别,以它们的首位数字表示,例如1xx,2xx,3xx,4xx和5xx。

1. 1xx(信息响应)

指示请求已收到,继续处理。

例如:

  • 100(继续):客户端应继续其请求
  • 101(切换协议):根据客户端的要求,服务器会切换协议。

2. 2xx(成功)

表明请求已被成功接收,理解,和接受。

例如:

  • 200(成功):请求成功
  • 201(已创建):请求成功并且服务器创建了新的资源
  • 202(已接受):服务器已接受请求,但尚未处理

3. 3xx(重定向)

需要客户端采取进一步的操作才能完成请求。

例如:

  • 300(多种选择):针对资源有多个配置可用,需要用户选择其中一个。
  • 301(永久移动):请求的网页已永久移动到新位置
  • 302(临时移动):服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

4. 4xx(请求错误)

表示请求包含语法错误或无法完成请求。

例如:

  • 400(错误请求):服务器无法理解请求的格式
  • 401(未授权):用户需要身份验证
  • 403(禁止):服务器理解请求客户端的请求,但是拒绝执行它。
  • 404(未找到):服务器找不到请求的网页。

5. 5xx(服务器错误)

表示服务器在尝试处理请求时发生内部错误。

例如:

  • 500(服务器内部错误):服务器遇到错误,无法完成请求
  • 502(错误网关):服务器作为网关或代理,从上游服务器收到无效响应。
  • 503(服务不可用):服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
  • 504(网关超时):服务器作为网关或代理,但是没有及时从上游服务器收到请求。

表格形式

状态码含义描述
100继续客户端应当继续发送请求。
101切换协议服务器根据客户端的请求切换协议。
200OK请求成功。一般用于GET与POST请求。
201已创建请求成功并且服务器创建了新的资源。
202接受已接受请求,但未处理完成。
203非授权信息请求成功,但返回的元信息不在原始服务器上,而是从一个副本返回的。
204无内容服务器成功处理,但未返回内容。
205重置内容服务器处理成功,用户终端(例如:浏览器)应重置文档视图。
206部分内容服务器成功处理了部分GET请求。
300多种选择请求的资源可包含多个位置,可用于自动选择服务器。
301永久移动请求的资源被永久的移动到新URI,返回信息会包括新的URI。
302临时移动与301类似,但资源只是临时被移动。
303查看其他位置请求对应的资源存在着另一个URI,应使用GET方法获取该资源。
304未修改资源未改变。
305使用代理被请求的资源必须通过指定的代理获取。
306已经废弃在以前版本的HTTP中使用。
307临时重定向与302类似,但对于POST请求,会跳转到新的URI并使用GET方法。
400错误请求请求中有语法问题,或不能满足请求。
401未授权需要证明身份。
402需要付款预留的响应,目前未被使用。
403被禁止访问服务器拒绝请求。
404找不到无法找到所请求的资源。
405不允许的方法请求中的方法被禁止。
406不可接受服务器只能生成客户端不接受的响应。
407需要代理验证客户端必须通过代理授权。
408请求超时服务器等待请求超时。
409冲突服务器在满足请求时发现冲突。
410过期请求的资源已经不存在。
411需要长度服务器无法处理不包含Content-Length的请求信息。
412未满足前提条件服务器未满足客户端在请求中设置的其中一个前提条件。
413请求实体过大请求的实体过大,服务器无法处理。
414请求URI过长请求URI过长,服务器无法处理。
415不支持媒体类型请求的格式不受请求页面的支持。
416请求范围不满足请求中包含的Range头字段不能与响应中的实体兼容。
417未满足期望服务器不能满足Expect头字段指定的预期。
500服务器内部错误服务器遇到了一个未曾预料的状况,导致不能完成客户端请求。
501未实现服务器不支持当前请求所需要的某个功能。
502错误网关当作为一个代理或者网关时,处理其他服务器的响应失败。
503服务器目前无法使用由于过载或者维护,服务器暂时无法处理请求。
504网关超时作为一个网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器收到响应。
505HTTP版本不支持服务器不支持,或者拒绝支持在请求中使用的 HTTP 版本。

以上,就是HTTP响应状态码的基本信息。在软件开发过程中,了解并正确使用这些状态码,有助于增强应用程序的健壮性和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/736126.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拥抱简洁:探索Stylus的简洁语法与CSS预处理器之美

文章目录 1. 简洁的语法2. 强大的功能3. 嵌套规则4. 变量支持5. Mixin 混合6. 扩展支持7. 条件语句8. 内置函数9. 可扩展性10. 轻量高效附录:前后端实战项目(简历必备) 推荐:★★★★★ Stylus 是一种 CSS 预处理器,具…

OpenCV 入门教程:Laplacian算子和Canny边缘检测

OpenCV 入门教程: Laplacian 算子和 Canny 边缘检测 导语一、Laplacian 算子二、Canny 边缘检测三、示例应用3.1 图像边缘检测3.2 边缘增强 总结 导语 边缘检测在图像处理和计算机视觉领域中起着重要的作用。 Laplacian 算子和 Canny 边缘检测是两种常用的边缘检测…

pytorch-Tensor

神经网络的数据存储中都使用张量(Tensor),那张量又是什么呢? py 张量这一概念的核心在于,它是一个数据容器。它包含的数据几乎总是数值数据,因此它是数字的容器。你可能对矩阵很熟悉,它是二…

商城小程序页面展示

——首页登录(wx.login(),getPhoneNumber) 进入首页时,加载商品列表数据展示在页面。从缓存中获取token信息,判断用户登录状态,如果用户没有登录,调用微信小程序的login方法,进行登…

Spring Boot原理分析(二):项目启动(下)——自动装配

文章目录 一、Spring手动装配1.使用XML配置文件2.使用Java注解3.使用Java类 二、Spring Boot自动装配1.AutoConfigurationPackage2.Import(AutoConfigurationImportSelector.class) 一、Spring手动装配 Spring Framework提供了多种手动装配的方式,其中比较常见的有…

硬盘被程序使用

diskutil list diskutil umount /dev/disk2s1退出该进程 硬盘即可成功退出

springboot+redis+mysql+quartz-通过Java操作jedis使用pipeline获取缓存数据定时更新数据库

一、重点 代码讲解:6-点赞功能-定时持久化到数据库-pipelinelua-优化pipeline_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1yP411C7dr 代码: blogLike_schedule/like06 xin麒/XinQiUtilsOrDemo - 码云 - 开源中国 (gitee.com) https://g…

ubuntu下,verdi语法错误Syntax error: “(“ unexpected

【问题】/home/EDA_TOOLS/synopsys/verdi/verdi/Verdi_O-2018.09-SP2/bin/verdi: 56: /home/EDA_TOOLS/synopsys/verdi/verdi/Verdi_O-2018.09-SP2/bin/verdi: Syntax error: "(" unexpected 【解析】 代码对于标准bash而言没有错,因为Ubuntu/Debian为了加…

网络应用基础交换机的基础操作(NETBASE第六课)

网络应用基础交换机的基础操作(NETBASE第六课) 1 回顾代码实操 主题背景的转换 字体设置 背景的设置 第一点 在操作ENSP个人建议要关闭防火墙 第二点 在操作ENSP软件是观察下面的软件是否全部关闭了 第三点 打开软件 ENSP软件注册信息 操作如下 注册前…

Oracle之Scott用户

Oracle增删改查,事务与序列 前言 1、解锁scott用户 2、雇员表(emp) 3、部门表(dept) 4、工资等级表(salgrade)了解 5、奖金表(bonus)了解 1、解锁scott用户 --解锁scot…

对卷积和全连接之间关系的学习(1*1卷积与全连接层可以互换吗?)

1.对于卷积和全连接 首先我们看一张图,它是一张关于卷积的操作: 然后在看关于全连接的操作: 从上面两张图中可以看出卷积的过程和全连接的过程,我们利用粉色的卷积核在image上进行卷积,进行内积计算得到输出值3&#…

调用GPU进行深度学习模型训练问题检查总结

1、电脑是否具有nvidia的GPU显卡。 2、安装的cuda版本是否超过显卡支持的最高版本。 在nvidia设置->帮助->系统信息->组件,可查看。 3、安装的pytorch是否为gpu版,即使在官网中复制的gpu版安装命令,安装得到的也有可能为cpu版。 建…

【监控系统】监控系统简介以及主流监控框架对比

互联网应用中离不开监控系统,那么为什么会有监控系统呢? 互联网公司产品通常是通过软件、网站、App或其他数字化方式提供服务的,这类产品在使用过程中可能会面临一系列风险和挑战。 比如网络故障或稳定性问题,由于网络故障、硬件…

外设资源共享须知

外设资源共享 具有相同ID的只能使用一个,无法同时使用。 例如当使能了SPIM0, 就不能用TWIM0,因为基地址相同,不能同时使用。此时建议使用TWIM1. 在sdk_config.h 中配置时需留意。

tecplot360 只显示指定phase的设定体积分数的区域

tecplot360 只显示指定phase的设定体积分数的区域 到数入据抽取切面设定显示体积分数范围 参考1: Tecplot中如何提取水线面(自由表面)并绘图 参考2: 两相流计算中,如何用Tecplot提取水相断面平均物理量? …

创建一个django项目详细说明

1.首先安装django pip install django 2.创建django项目 django-admin startproject myproject 输入命令后自动生成相关文件 manage.py文件:这是管理Django项目的重要命令行工具,它主要用于启动项目、创建应用和完成数据库的迁移等。settings.py文件&…

mongodb集群工作原理学习

mongodb集群 MongoDB集群有好几种方式:,主从模式,副本集模式和分片的模式 其中主从模式基本不再使用,大多是后面两种 副本集模式 副本集模式主要是用于实现服务的高可用性,类型Redis的哨兵模式. 它主要是的特点: 创建集群后会有主节点(primary)和从节点(secondary). 但从节点…

1765_Perl实现fileread功能

全部学习汇总: GreyZhang/perl_basic: some perl basic learning notes. (github.com) fileread是MATLAB中的一个函数,可以实现对一个文本文件的全文读取。读取后的内容返回给一个字符串量。在Python中也有类似的功能,不过MATLAB中的这个更能…

快速创建ES集群

win10 中docker 设置 快速创建集群 访问 官网 elasticsearch/docs/reference/setup/install/docker at main elastic/elasticsearch GitHub 负责上面2个文件,并修改,修改如下 .env文件 # Password for the elastic user (at least 6 characters) …

【私有云】网络虚拟化

前言 大家好,我是秋意零。 之前一直对 OpenStack 网络很陌生与神奇啊,不知道它是如何实现的,网络结构是怎样的。不过,今天介绍的是网络虚拟化,它在 OpenStack 中及云计算中是非常重要的概念,是理解 OpenS…