Express异常捕获

​非线性分析-增加位移量可能出现下面错误。虽然求解无法在所有时间点完成,但在某些点上仍能够求解部分结果。请参阅“帮助系统”中的故障排除,以了解更多信息详情。由于受约束,规划求解引擎无法收敛 基于收敛状态拆分载荷步‌:在已收敛的载荷步基础上,将未收敛的关键区域拆分为更细的子步,比如在载荷突变点前设置5~10个子步,逐步加载。替换冲突约束为弱约束‌:若存在约束冲突,将刚性约束替换为弱弹簧约束(刚度设为1e-6~1e-4),既限制刚体位移,又不影响结构的变形自由度,命令流:SPRING, NODE, K, 1e-6。部分区域约束完整,但存在未被约束的刚体自由度,或约束类型与大变形/接触逻辑冲突,比如某部件的位移约束在初始阶段有效,但大变形后约束位置脱离实际受力点,导致求解器在该阶段无法收敛。 阅读详情

在使用Express框架设计web应用时,一定会遇到异常处理问题。
因为用户数据或代码自身问题,常常引起请求时,控制器内部异常,res返回不能被执行,前台表现为请求“卡死”。

1 处理 Exception

1.1 Express 错误处理中间件

为了避免这种情况,Express有“错误处理中间件”的机制。

const express = require('express');

process.on('unhandledRejection', rej => console.warn('全局捕获Rejection', rej));

const app = express();

const router = express.Router();

router.get('/', function (req, res) {
    JSON.parse('{{'); // 抛出异常
    res.send('首页');
});

app.use(router);

// 错误处理中间件
app.use(function (err, req, res, next) {
  console.warn('错误处理中间捕获Exception', err);
  res.send('内部错误');
});

app.listen(5000, () => console.log('Server Start ...'));

上述代码运行后,访问http://localhost:5000时,会返回“内部错误”,表示控制器内错误被错误处理中间件捕获。

2 处理 Rejection

2.1 存在的问题

AsyncFunction内部异常时,不会抛出Exception,而是Rejection,不能被传统的try…catch…方式捕获。
上述代码如果改为:

// function => AsyncFunction
router.get('/', async function (req, res) {
    JSON.parse('{{'); // 抛出异常
    res.send('首页');
});

这时,访问主页,会发现卡死,并且后台打印“全局捕获Rejection…”。这表示异常不能被错误处理中间件捕获,而是在全局被捕获了。没有人处理请求的返回了,于是请求卡死。

2.2 异常处理装饰器

ctrlRejHandler.js :

module.exports = (ctrl) => {
  if ({}.toString.call(ctrl) !== '[object AsyncFunction]') throw Error('Try to use ctrlErrHandler to decorate an Object not a AsyncFunction');
  return function (req, res, next) {
    return ctrl(req, res, next).catch(rej => {
      console.warn('错误处理装饰器 捕获错误', rej);
      res.send('内部错误');
    });
  };
};
2.3 异常处理装饰器的位置问题

理论上,我们应该为每一个AsyncFunction类型的装饰器都使用异常处理。也就是说,我们希望尽量在全局安装装饰器,而不是每次使用控制器时都添加。
一种更简约的写法是,在使用module.exports导出控制器时,包装整个函数参数对象。但这会带来一个问题:无法通过IDE的定位功能定位ctrl了。

容易想到,控制器就是用在路由中的,至少路由使用控制器时,默认进行包装就好了。
可以定义一个函数来包装router,实现这样的功能。更改router.get/post/…等使用控制器的函数,对它们的最后一个回调函数参数(即控制器)进行错误处理。

routerRejHandler.js :

module.exports = routerRejHandler;

// 对ctrlRejHandler稍作修改,使其支持一般的function
function ctrlRejHandler(ctrl) {
  if (typeof ctrl !== 'function') throw Error('Try to use ctrlRejHandler to decorate an Object not a function');
  if ({}.toString.call(ctrl) !== '[object AsyncFunction]') {
    return ctrl;
  }
  return function (req, res, next) {
    return ctrl(req, res, next).catch(rej => {
      console.warn('错误处理装饰器 捕获错误', rej);
      res.send('内部错误');
    });
  };
};

// router装饰器,自动对控制器进行错误捕获
function routerRejHandler(router) {
  const methods = require('methods');
  [...methods, 'all'].forEach(method => {
    if (router[method]) {
      router[method] = function (path, ...fns) {
        const route = this.route(path);
        const ctrlIndex = fns.length - 1;
        // 只认为最后一个回调函数参数为控制器,之前的为中间件
        fns[ctrlIndex] = ctrlRejHandler(fns[ctrlIndex]);
        route[method].apply(route, fns);
        return this;
      };
    }
  });
  return router;
}

使用之:

const express = require('express');
const router = routerRejHandler(express.Router());

这时,对router.get('/path', 中间件1, 中间件2, 控制器)这样的情况,无需做任何其他处理,控制器抛出的Rejection将会被自动捕获和处理。

进一步的,可以为routerRejHandler增加一个回调函数,用以控制如何处理错误。

2.4 最佳实践

rejHandler.js :

module.exports = {
  ctrlDecorator,
  routerDecorator
};

function ctrlDecorator(ctrl, dealer) {
  if ({}.toString.call(ctrl) !== '[object AsyncFunction]') {
    return ctrl;
  }
  return function (req, res, next) {
    return ctrl(req, res, next).catch(rej => {
      if (dealer) return dealer(req, res, next, rej);
      res.send('Internal Error');
    });
  };
}

function routerDecorator(router, dealer) {
  const methods = require('methods');
  [...methods, 'all'].forEach(method => {
    if (router[method]) {
      router[method] = function (path, ...fns) {
        if (fns.length === 0) return;
        const route = this.route(path);
        const ctrlIndex = fns.length - 1;
        if (typeof fns[ctrlIndex] !== 'function') throw Error('The last param should be a controller, but not a function');
        fns[ctrlIndex] = ctrlDecorator(fns[ctrlIndex], dealer);
        route[method].apply(route, fns);
        return this;
      };
    }
  });
  return router;
}

使用:

const routerRejHandler = require('./rejHandler').routerDecorator;

const router = routerRejHandler(express.Router(), function (req, res, next, rej) {
  console.warn('捕捉到控制器内Rejection', rej);
  res.status(500);
  res.send('内部错误');
});

另外,若不使用router,装饰器同样可以用于app对象。

Python全栈项目--手机语音远程控制智能家居系统(含嵌入式控制) 摘要:本项目实现了一个基于Python全栈的智能家居语音控制系统,支持手机端语音指令控制家居设备。系统采用FastAPI后端+Vue3前端的架构,集成Web Speech API实现语音识别,通过嵌入式设备(如ESP32)执行硬件控制。功能包括用户认证、设备管理、场景联动、指令解析和日志记录,支持HTTP轮询和直推两种命令下发模式。项目涵盖物联网全链路开发,适用于课程设计或毕业设计原型开发。 阅读详情

相关推荐

Calibre电子书阅读器个性化样式定制指南

本文详细介绍了如何通过Calibre电子书阅读器的用户样式表功能进行深度个性化样式定制。从修改全局字体、行距、背景配色(包括深色/浅色模式)到美化代码块、引用等特殊元素,本指南提供了完整的CSS代码示例与实战技巧,帮助用户打造专属的舒适阅读环境,显著提升电子书阅读体验。

vv45678的博客 921

nodejs教程(五)--express异常处理

nodejs教程(五)–express异常处理 1. 异常捕获 通过thorw方法可以扔出错误。 throw new Error('测试异常功能') 2. Express内置异常处理 error_handler_middleware一般作为最后的异常处理器,接收前面的错误。 not_found_handler用于处理404错误 当url路径错误(此处任意写一个url)时,就会报指定...

qq_42019597的博客 1176

实例讲解Simulink应用层开发CAN报文解包及CAN信号设置方法

本文通过讲解MCU CAN解包模块的模块设置、输入输出信号的设置及仿真测试验证,说明了CAN解包模块的设置方法、CAN解包模块输入输出信号的设置方法以及CAN解包模块的仿真测试及修正方法。在模型搭建过程中,建议养成一种搭建完成仿真测试验证的习惯,在模块阶段发现错误,解决错误,避免在后期模块集成之后报出大量错误,增加解决错误的工作量和难度。希望通过本文的介绍能给相关技术人员带来一些参考和帮助。

qq_43011586的博客 5682

【Express.js】全局错误处理

express.js 中的全局错误处理

Evanpatchouli 的博客 2922

告别信号毛刺!手把手教你用ADS和IBIS-AMI模型搞定PCIe Gen3眼图仿真

本文详细介绍了如何使用Keysight ADS和IBIS-AMI模型进行PCIe Gen3眼图仿真,解决高速信号传输中的信号质量问题。从仿真环境搭建、S参数预处理到眼图优化与故障排除,提供了一套完整的工程实践指南,帮助工程师提升PCIe Gen3接口的信号完整性。

weixin_28366053的博客 371

ABAP on HANA/CDS view/AMDP 大乱炖

文章目录1. HANA的三大杀器1.1 内存式数据库1.2 多核架构1.3 列式存储1.3.1 数据压缩1.3.2 并行处理1.3.3 聚集和索引1.3.4 代码下移2. CDS 概念2.1 ABAP 开发环境2.2 OPEN SQL语句2.3 CDS 到底是啥2.4 CDS 类型2.5 创建CDS view3. CDS 实战3.1 Annotation注解3.2 Case 语句3.3 数学计算3.4 字符串表达3.5 货币转换3.6 聚集语句3.7 Join3.8 Union3.9 参数3.10 作为子C

weixin_45689053的博客 4788

Node.js:express框架之错误处理

错误处理是指Express如何捕获和处理同步和异步发生的错误。Express内置默认的错误处理程序,开发人员也可以编写自己的错误处理程序。 /** * express框架的路由与中间件 */ const express = require("express"); const path = require("path"); const fs = require("fs"); const server = express(); server.get("/",(req,res,next)=&gt

成长ing中的w的专栏 2410

HALCON基于描述符的模板匹配(未标定)

HALCON基于不标定描述符的模板匹配

king_linj的博客 892

Vue——Vue-Router的push和replace方法[Uncaught (in promise) Error]解决方案

问题描述 在升级了Vue-Router版本到到3.1.0及以上之后,页面在跳转路由控制台会报Uncaught (in promise) Error的问题 Vue更新日志 https://github.com/vuejs/vue-router/releases V3.1.0版本里面新增功能:push和replace方法会返回一个promise, 你可能在控制台看到未捕获的异常 问题分析 解释:没有捕获异常。 解决方案 方法一: 检查代码 1、首先检查router.js中的路由...

无限迭代中...... 3314

把 Client 当成 ABAP 系统的多租户底座:从 sy-mandt 到 CDS_CLIENT 的隔离机制与工程实践

本文深入解析SAP ABAP系统中Client概念的本质与应用。Client不仅是数据表的MANDT字段,更是会话级别的隔离边界,贯穿用户登录、授权和数据访问控制全过程。文章从ABAP SQL的隐式Client处理机制出发,详细介绍了USING CLIENT、USING ALL CLIENTS等安全跨客户端访问方式,并对比了传统CLIENT SPECIFIED的风险。同时阐述了ABAP CDS中@ClientHandling注解的类型与算法选择,包括#AUTOMATED自动拼接和#SESSION_VARIA

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 183

11、系统稳定性分析与李雅普诺夫函数的应用

本文深入探讨了李雅普诺夫函数在系统稳定性分析中的核心作用,重点介绍了时变与时不变系统的稳定性判据差异,以及巴尔巴拉特引理在处理非自治系统中的应用。文章还阐述了正线性系统与严格正实传递函数的性质及其在非线性控制系统中的重要性,并展示了李雅普诺夫函数在评估主导时间常数和设计快速干扰抑制控制策略方面的实际应用。通过具体示例和流程图,系统地总结了李雅普诺夫方法在稳定性分析、性能评估与控制器设计中的多维度价值,同时指出了当前挑战与未来发展方向。

Jerry的专栏 93

express-async-errors全局异常捕获

express-async-errors解决全局异常捕获问题

qq_43560795的博客 1482

Python 爬虫实战:全球咖啡期货市场数据采集与分析全攻略

通过本项目,我们实现了对全球咖啡期货市场数据的采集、处理和可视化,为市场分析和决策支持提供了数据基础。未来,可以进一步结合机器学习和深度学习技术,对咖啡期货价格进行预测和建模,提高市场分析的准确性和效率。

2201_76125261的博客 396

express捕获全局异常的三种方法

express捕获全局异常的三种方法

Littleree的博客 563

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

nodejs的express全局异常捕获

**前言:**在使用express写接口的时候如果出现未知异常没有捕获,就会出现程序抛出异常而退出。提示信息也不是很好。使用普通的全局异常拦截只能拦截到同步代码,不能拦截到promise这些异步函数的方法。在网上查到有一个插件比较方便,这里就提供这个插件使用方法。插件名:express-async-errors 插件地址: https://github.com/davidbanham/express-async-errors 复制代码 插件上的使用方法

unhejing的博客 3328

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

nodejs express异常捕获

nodejs express异常捕获

10年职场两茫茫,35岁凄凉奈若何 154

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

nodejs的express全局异常捕获,别再说自己不会了

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】给大家分享一些关于HTML的面试题。TML的面试题。**[外链图片转存中…(img-ILYWBz7R-1711712916813)][外链图片转存中…(img-N2VGHjMX-1711712916813)]

935

web基础·express错误处理中间件不能捕获异步异常?

在学习的时候,视频里只是说了下【错误处理中间件只能捕获同步异常,不能捕获异步异常】,然后就开始讲怎样来捕获异步异常。但是没有举一个例子来甩在我的脸上,所以就陷入了怀疑的状态,然后开始了自己下面的测试。(可能是有点钻牛角尖吧) 首先呢,先寻摸个异步处理,第一想到的就是定时器 setInterval和setTimeout 前者是每隔多久调用一次;后者是隔多久后调用一次就不再调用。 先来个同步异常,顺便测下定时器程序写对了么 const express = require('express');.

昔冰_G的博客 945

Express错误处理终极指南:全局异常捕获的完整解决方案

Express作为Node.js最流行的Web框架,其**错误处理机制**对于构建稳定可靠的应用程序至关重要。通过合理的**全局异常捕获**策略,开发者可以有效防止应用崩溃,提升用户体验。🚀 ## 为什么需要全局错误处理? 在Web应用开发中,错误是不可避免的。无论是数据库连接失败、文件读取错误,还是用户输入异常,都需要有相应的处理机制。Express提供了灵活的错误处理中间件架构,让开发者

gitblog_01426的博客 573

nodejs的express全局异常捕获,前端开发自学教程

面试题千万不要死记,一定要自己理解,用自己的方式表达出来,在这里预祝各位成功拿下自己心仪的offer。CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】[外链图片转存中…(img-ShVZ36Gy-1712032248205)][外链图片转存中…(img-PCMGixym-1712032248205)]

2401_84006689的博客 1034

node 进阶 | 通过node中如何捕获异常阐述express的特点

node如何捕获异常     node基于js的单线程,有了非阻塞异步回调的概念,但是在处理多个并发连接时,并发环境要求高,最重要的是单线程,单核CPU,一个进程crash则web服务都crash,但是为什么node还这么火?甚至有了Node工程师这个岗,肯定就是node有自己crash之前与之后的解决方法,比如捕获异常    问:nodejs如何捕获异常?答:回调函数中有err形参,cons...

weixin_30567225的博客 210

Express错误处理完整指南:从异常捕获到优雅降级

Express框架的错误处理机制是构建健壮Web应用的关键。本文将详细介绍Express错误处理的完整流程,从异常捕获到优雅降级,帮助开发者掌握这一重要技能。Express错误处理能够确保应用在遇到异常时仍能正常运行,提供更好的用户体验。💪 ## 为什么需要错误处理? 在Web应用开发中,错误是不可避免的。数据库连接失败、文件不存在、用户输入验证错误等都会导致应用异常。如果没有合适的错误处理

gitblog_00057的博客 517

express中使用domain捕获全局异常,node服务不会挂,返回给前端500状态码

express中使用domain捕获全局异常,node服务不会挂,返回给前端500状态码

徐同保的专栏 885

如何在Express.js中处理异常情况?

你可以定义一个全局的错误处理中间件来捕获所有路由级别的错误。// 错误处理中间件// 记录错误堆栈' });});如果你希望根据不同的HTTP状态码返回不同类型的响应,可以检查err.status});

邮箱:uemgyth@163.com 649

Express实现WebAPI之错误异常处理

概要 Express 是一个简洁而灵活的 node.js Web应用框架, 提供一系列强大特性帮助你创建各种Web应用。本文主要介绍如何使用express框架的中间件来实现WebAPI的异常,错误捕获处理。 设计和实现 项目背景知识和程序中已有代码,请参考我的博文Express实现WebAPI之请求实现与调试 错误处理相关类的设计思想是所有API的error类都继承自JS的Error基类,每种错误类型对应一个Http状态码(400到599)本文只列举出了常用的几个错误类型,类图如下所示: Custome

weixin_43263355的博客 1961
上一篇: 用async-await实现类似Promise.all()的执行效果
下一篇: Promisify函数
平仄_csdn
博客等级 码龄10年 11粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值