Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >​如何处理Express和Node.js应用程序中的错误

​如何处理Express和Node.js应用程序中的错误

作者头像
前端知否
发布于 2020-03-23 10:03:05
发布于 2020-03-23 10:03:05
5.8K00
代码可运行
举报
文章被收录于专栏:前端知否前端知否
运行总次数:0
代码可运行

使用Express创建API时,我们定义了路由及其处理程序。在理想情况下,API的使用者只会向我们定义的路由发出请求,并且路由将正常运行。但是,我们不会生活在理想的世界中:)。Express知道这一点,并使我们API中的错误处理变得轻而易举。

在这篇文章中,我将解释如何处理Express中的错误。

该代码只有一个JavaScript文件index.js,其内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const express = require("express");
const app = express();
const port = 3000;

app.get("/", (req, res, next) => {
 res.send("Welcome to main route!");
});

app.get("/about", (req, res, next) => {
 res.send("This is the about route!");
});

app.listen(port, () => console.log(`App listening on port: ${port}`));

创建一个新文件夹,npm init -y,然后创建npm i --save express。在此文件夹中创建index.js并将代码粘贴到其中。

错误来源

Express应用程序中可能会发生两种基本错误。

一种错误是对没有定义路由处理程序的路径发出请求。例如,index.js定义了两条get路由(/ 和 /about)。我正在使用get路由,以便我们可以轻松地在浏览器中测试路由。

请注意,路由定义了请求路径,并对该路径发出请求时调用了中间件函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app.HTTPMethod(path, middleware)
// HTTPMethod = get, post, put, delete …
代码语言:javascript
代码运行次数:0
运行
复制

错误的另一个来源是当路由处理程序或代码中的其他任何地方出现问题时。例如,如下更新`ndex.js`中的第一个路由:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
…
app.get(/, (req, res, next) => {
// 通过抛出错误来破坏应用程序,从而模仿错误!
throw new Error(‘Something went wrong’);
 res.send(‘Welcome to main route!)
})
代码语言:javascript
代码运行次数:0
运行
复制

重新启动服务器并访问localhost:3000,您将看到一个错误和一个堆栈跟踪信息。

通过路由排序处理路由错误

删除在index.js中引发错误的语句。启动服务器并在浏览器中访问localhost:3000,您应该看到以下消息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Welcome to the main route!
代码语言:javascript
代码运行次数:0
运行
复制

访问localhost:3000/about:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
This is the about route!
代码语言:javascript
代码运行次数:0
运行
复制
Express如何查找路由?

Express创建了一个可以称为路由表的地方,它将路由按照代码中定义的顺序放置。当请求进入Web服务器时,URI通过路由表运行,并且使用表中的第一个匹配项-即使存在多个匹配项。

如果找不到匹配项,则Express将显示错误。要查看实际效果,请访问localhost:3000/contact,浏览器将显示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Cannot GET /contact
代码语言:javascript
代码运行次数:0
运行
复制

检查路由表后,Express发现/ contact不匹配,因此它以错误响应。

如何利用路由顺序

由于Express在路由表中找不到给定URI时显示错误消息,因此这意味着我们通过确保此路由是路由表中的最后一条来定义用于处理错误的路由。错误路由应匹配哪条路径?

由于我们不知道用户将请求的路径不存在,因此我们无法将路径硬编码到此错误路由中。我们也不知道请求可能使用哪种HTTP方法,因此我们将使用app.use()而不是app.get。

将以下路由放在app.listen()之前的路由声明的末尾,更新index.js:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 这个匹配所有路由和所有请求方法
app.use((req, res, next) => {
 res.status(404).send({
status: 404,
error: ‘Not found’
 })
})

app.listen(port …

重新启动服务器并访问未定义的路径,例如localhost:3000/blog

现在,我们有了一个自定义的错误响应:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ "status": 404, "error": "Not found" }

请记住,路由的顺序对于此工作非常重要。如果此错误处理路由位于路由声明的顶部,则每个路径(有效和无效)都将与其匹配。我们不希望这样,因此错误处理路由必须最后定义。

处理任何类型的错误

如果我们只想处理从请求到不存在路径的错误,则上一节中的解决方案有效。但是它不能处理我们的应用程序中可能发生的其他错误,并且是处理错误的不完整方法。它只能解决一半的问题。

更新index.js,在第一个get路由中引发错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
…
app.get(/, (req, res, next) => {
throw new Error(‘Something went wrong!);
 res.send(‘Welcome to main route!)
})
代码语言:javascript
代码运行次数:0
运行
复制

如果您访问localhost:3000,您仍然会看到Express默认错误处理程序的响应。

定义错误处理中间件

错误处理中间件函数的声明方式与其他中间件函数相同,只是它们具有四个参数而不是三个参数。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 错误处理中间件
app.use((error, req, res, next) => {
console.error(error.stack);
 res.status(500).send(‘Something Broke!);
})

将此代码放在app.listen之前和第一个app.use之后,然后重新启动服务器,然后访问localhost:3000。现在的响应是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Something Broke!

现在,我们正在处理两种类型的错误。啊哈!

这行得通,但是我们可以改善它吗?是的。

当您将参数传递给next()时,Express会假定这是一个错误,它将跳过所有其他路由,并将传递给next()的所有内容发送到已定义的错误处理中间件。

更新index.js:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
…
app.use((req, res, next) => {
const error = new Error(“Not found”);
 error.status = 404;
 next(error);
});

// 错误处理中间件
app.use((error, req, res, next) => {
  res.status(error.status || 500).send({
error: {
status: error.status || 500,
message: error.message || ‘Internal Server Error’,
    },
  });
});
代码语言:javascript
代码运行次数:0
运行
复制

现在,处理错误请求的中间件功能将移交给错误处理程序中间件。next(error)表示:“嘿,错误处理程序先生,我有一个错误,请处理!”。

为了确保您与我在同一页面上,请输入error.status ||。500表示如果错误对象没有status属性,我们将500用作状态代码。index.js的完整内容是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const express = require("express");

const app = express();
const port = 3000;

app.get("/", (req, res, next) => {
throw new Error("Something went wrong!");
  res.send("Welcome to main route!");
});

app.get("/about", (req, res, next) => {
  res.send("This is the about route!");
});

app.use((req, res, next) => {
const error = new Error("Not found");
  error.status = 404;
  next(error);
});

// 错误处理中间件
app.use((error, req, res, next) => {
  res.status(error.status || 500).send({
    error: {
      status: error.status || 500,
      message: error.message || 'Internal Server Error',
    },
  });
});

app.listen(port, () => console.log(`App listening on port: ${port}`));
代码语言:javascript
代码运行次数:0
运行
复制

如果您提供的是静态页面而不是发送JSON响应,则逻辑仍然相同。您只需要更改错误处理程序中发生的事情即可。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app.use((error, req, res, next) => {
console.error(error); // 打印输出错误
 res.render('errorPage') // 渲染错误页面给用户
});
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端知否 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Express 使用详情
Express 是一款基于 Node.js 的 Web 开发框架,它提供了简洁的 API,使得 Web 应用开发变得更加高效和方便。本文将详细介绍 Express 的使用方法,包括安装、基本概念、路由、中间件、模板引擎等,并给出相应的代码示例。
世间万物皆对象
2024/03/20
2290
Express框架
Express是一个基于Node平台的web应用开发框架,它提供了一系列的强大特性,帮助你创建各种Web应用。我们可以使用 npm install express 命令进行下载。
星辰_大海
2020/11/10
1.9K0
Express框架
Express框架
Express是一个基于Node平台的web应用开发框架,它提供了一系列的强大特性,帮助你创建各种Web应用。我们可以使用 npm install express 命令进行下载。
梨涡浅笑
2020/11/11
1.9K0
Express框架
Express框架快速入门
官网对这个框架的解释是:基于 Node.js 平台,快速、开放、极简的 Web 开发框架。Express的官网地址是https://www.expressjs.com.cn 。
害恶细君
2022/11/22
5.3K0
Express框架快速入门
基于Node.js的Express框架
package.json文件中的start任务 下面即表示任务运行成功
_kyle
2020/08/24
5.7K0
基于Node.js的Express框架
2024 版:Node.js+Express+Koa2+Nest.js 开发服务端(高の青)
在现代的 web 开发中,Node.js 是一种非常流行的服务器端 JavaScript 环境。我们来编写一个大致的框架和一些关键代码片段,以帮助你了解如何使用 Node.js、Express、Koa2 和 Nest.js 开发服务端应用。
百课优用户
2024/07/29
3680
08_Express框架
使用Node.js进行服务器开发,开发效率比较低,例如在实现路由功能和静态源访问功能时,代码写起来很烦琐 为了提高Node.js服务器的开发效率,人们开发了Express框架,它可以帮助开发人员快速创建网站应用程序。
张哥编程
2024/12/13
1660
08_Express框架
nodeJS之Express框架---中间件
Express框架中一个非常重要的概念——中间件。在Express框架中,允许通过中间件的使用来调用各种第三方类库,这让我们的开发工作变得更为方便,也使得我们可以开发出各种更为强大的应用程序。
IT工作者
2022/05/13
2.6K0
Node JS 中间件如何工作?
你需要安装一些东西来创建、使用和测试 Express 中间件。首先需要 Node 和 NPM。为确保已经安装,可以运行:
疯狂的技术宅
2020/02/18
3.3K0
如何在Node.js和Express中上传文件
大量的移动应用程序和网站允许用户上传个人资料图片和其他文件。 因此,在使用Node.js和Express构建REST API时,通常需要处理文件上传。
ccf19881030
2020/10/26
6.8K0
如何在Node.js和Express中上传文件
前端Express框架必学之:Node.js项目搭建与接口开发实战
Express是一个基于Node.js平台的轻量级Web应用框架,它提供了简洁的API和丰富的功能,使得开发者能够快速地构建Web服务器和API。本文将带领大家从零开始,使用Express框架搭建一个简单的Web应用。
肥晨
2024/04/24
2.3K0
前端Express框架必学之:Node.js项目搭建与接口开发实战
Express中间件,看这篇文章就够了(#^.^#)
okaychen
2018/01/05
2.1K0
Express中间件,看这篇文章就够了(#^.^#)
Express,Sequelize和MySQL的Node.js Rest API示例
本文翻译自Node.js Rest APIs example with Express, Sequelize & MySQL
ccf19881030
2020/11/10
12.9K0
Express,Sequelize和MySQL的Node.js Rest API示例
如何使用Node.js和Express实现Web应用程序中的文件上传
处理文件上传:使用Node.js和Express构建Web应用程序时,文件上传是一个常见的需求。在本教程中,您将学习如何使用Node.js和Express处理上传的文件。
zayyo
2024/02/09
5920
express新手入门指南
Node.js 已经成为 Web 后台开发圈一股不容忽视的力量,凭借其良好的异步性能、丰富的 npm 库以及 JavaScript 语言方面的优势,已经成为了很多大公司开发其后台架构的重要技术之一,而 Express 框架则是其中知名度最高、也是最受欢迎的后端开发框架。在这篇教程中,你将了解 Express 在 Node 内置 http 模块的基础上做了怎样的封装,并掌握路由和中间件这两个关键概念,学习和使用模板引擎、静态文件服务、错误处理和 JSON API,最终开发出一个简单的个人简历网站。
前端迷
2020/03/26
3.3K0
express新手入门指南
node.js:试试express
Express 框架是一个快速、开放、极简的 web 应用开发框架,用于构建灵活和强大的 web 应用和 API。它是 Node.js 平台上最流行的框架之一,因为它提供了一套丰富的功能来简化和加速 web 开发过程。
姓王者
2024/12/20
920
Nodejs之express框架的基本使用
此文是个人学习归纳的记录,腾讯云首发,未经允许,严禁转载,如有不对, 还望斧正, 感谢!
言志志
2024/04/30
2030
使用nodejs和express搭建http web服务
nodejs作为一个优秀的异步IO框架,其本身就是用来作为http web服务器使用的,nodejs中的http模块,提供了很多非常有用的http相关的功能。
程序那些事
2021/01/13
2K0
Express新手入坑笔记之动态渲染HTML
这里的public不会显示在url中, 为了方便判别静态文件的url请求, 我们在public内新建一个static文件夹, 这样所有请求静态文件的url,都会以static开头(这里借鉴了django处理静态文件的方法)
zhaoolee
2018/12/26
3.8K0
Express(一) ——简单入门
背景:参加的青训营项目,使用 Express 来实现后端,个人被分配到后端去。于是,简单速通了下 Express。项目结束,回头写下笔记,沉淀一下。
赤蓝紫
2023/01/02
3.6K0
Express(一) ——简单入门
相关推荐
Express 使用详情
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验