使用 Node.js 进行 Javascript 异步异常处理

2024-02-22

我目前正在开发一个 Node.js 应用程序,并且遇到了常见的异步代码问题。

我正在 Node 的 HTTP 模块之上实现一个服务服务器。

该服务器支持(类似express)路由。 例如,我的代码如下所示:

server.any("/someRoute",function(req,resp){
    resp.end("this text is sent to clients via http")
});

服务器需要能够承受故障,我不想在传递给任何函数的函数出现问题时使整个服务器崩溃。当我编写如下代码时会出现问题:

server.any("/someRoute",function(req,resp){
    setTimeout(function(){
        throw new Error("This won't get caught");
    },100);
});

我不知道如何才能在这里捕获错误。我不想因为一个服务器端故障而导致服务器崩溃,而是想为 500 个服务器提供服务。

我能想到的唯一解决方案确实没有表现力。我只是想出了使用process.on("uncaughtException",callback)以及使用 Node 0.8 的类似代码Domains(这是一种部分补救措施,但域目前有问题,而且这仍然不是很有表现力,因为我最终必须为每个句柄创建一个域)。

我想要完成的是具有约束力的throw从函数到作用域的操作,理想的解决方案是将函数中抛出的所有错误绑定到特定的处理函数。

这可能吗?在这种情况下处理错误的最佳实践是什么?

我想强调的是,它应该能够在错误请求之后继续服务请求,并且在每个请求上重新启动服务器或为每个处理程序创建域并捕获它们未捕获的异常对我来说似乎是一个坏主意。另外 - 我听说承诺可能能够帮助我(关于throw在承诺中),在这种情况下,承诺可以帮助我吗?


Warning:我不会推荐使用域的原始答案,将来域将被弃用,我在编写原始答案时获得了很多乐趣,但我不再相信它太相关了。相反 - 我建议使用事件发射器和具有更好错误处理能力的承诺 - 下面是带有承诺的示例。这里使用的承诺是Bluebird https://github.com/petkaantonov/bluebird:

Promise.try(function(){ 
    throw new Error("Something");
}).catch(function(err){
    console.log(err.message); // logs "Something"
});

超时(注意我们必须返回 Promise.delay):

Promise.try(function() {
    return Promise.delay(1000).then(function(){
        throw new Error("something");
    });
}).catch(function(err){
    console.log("caught "+err.message);
});

具有一般的 NodeJS 功能:

var fs = Promise.promisifyAll("fs"); // creates readFileAsync that returns promise
fs.readFileAsync("myfile.txt").then(function(content){
    console.log(content.toString()); // logs the file's contents
    // can throw here and it'll catch it
}).catch(function(err){
    console.log(err); // log any error from the `then` or the readFile operation
});

这种方法既快速又安全,我在下面的答案之上推荐它,该答案使用的域可能不会留下来。


我最终使用了域,我创建了以下文件mistake.js其中包含以下代码:

var domain=require("domain");
module.exports = function(func){
    var dom = domain.create();
    return { "catch" :function(errHandle){
        var args = arguments;
        dom.on("error",function(err){
            return errHandle(err);
        }).run(function(){
            func.call(null, args);
        });
        return this;
    };
};

以下是一些用法示例:

var atry = require("./mistake.js");

atry(function() {
    setTimeout(function(){
        throw "something";
    },1000);
}).catch(function(err){
    console.log("caught "+err);
});

它也像同步代码的普通 catch 一样工作

atry(function() {
    throw "something";
}).catch(function(err){
    console.log("caught "+err);
});

我希望得到有关解决方案的一些反馈

附带说明一下,在 v 0.8 中,显然当你捕获域中的异常时,它仍然会冒泡process.on("uncaughtException")。我在我的process.on("uncaughtException") with

 if (typeof e !== "object" || !e["domain_thrown"]) {

然而,文档建议反对process.on("uncaughtException") any way

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Node.js 进行 Javascript 异步异常处理 的相关文章

  • 有没有一种方法可以在没有输入的情况下发送表单值

    假设我有以下表格
  • 判断字符串是否包含有效的javascript代码

    我正在寻找一个C 返回的函数true如果字符串包含有效的 JavaScript 语法 例如 IsValidJavascript alert hello 会回来true but IsValidJavascript alertXXhelloZ
  • 将时间戳转换为一个数组

    在应用程序脚本 谷歌表中运行 我从 API 获取时间戳并返回此结果 1 6370611672429312E18 1 63706107263277082E18 我执行此代码并且工作正常 但问题不在数组中 我每次都需要它在数组中 const t
  • 如何将 Angular Universal 应用程序部署到 Node.js 生产服务器?

    我有一个带有 Universal 的 Angular 8 应用程序 我想将其部署到共享 Web 主机生产服务器 我提前与网络主机核实过 他们告诉我可以在他们的共享网络托管上托管 Angular 通用网络应用程序 但是 无论我做什么 我都无法
  • .points 不透明度/大小在三个.js 内

    我回来回答有关 points 的第二个问题 这次想知道如何将不透明度从 0 更改为 1 然后又回到距发射器的特定像素距离内 var particleCount 14 particles new THREE Geometry pMateria
  • 通过 JavaScript 单击按钮/页面提交

    我想了解 asp net 框架如何知道何时单击了按钮 因此一旦收到请求 就会在服务器上触发其单击事件 我需要了解它是如何工作的 因为我想从 JavaScript 触发按钮的服务器单击事件 我能够从 JavaScript 执行页面提交 doc
  • 如何从嵌套的 try-catch 块内重新抛出先前的异常? (C#)

    我有尝试类型转换的代码 如果失败 我想尝试其他方法 如果也失败 则重新抛出第一次转换尝试的原始异常 问题是我知道重新抛出的唯一方法是 throw 坐在 catch 块的末端 当我只想从另一个 catch 块中重新抛出时会发生什么 try v
  • Firefox Addon 中的 JQuery 导致多个警告

    我在 Firefox 插件中使用 jquery 但我不断收到大量警告消息 如下所示 anonymous function does not always return a value System JS WARNING resource g
  • AngularJS + jQuery 移动

    是否还有其他可能性来设计AngularJS以移动友好的方式应用程序CSS 我正在计划一个移动应用程序 并希望使用 AngularJS 进行逻辑和数据绑定 但我不想自己设计所有内容CSS The AngularJSFAQ说它使用jQuery
  • 可以禁用幻灯片的触摸模拟但不能禁用滚动条(危险的滑动器)吗?

    我的页面上有一个危险的滑动器 它成功地模拟了幻灯片和随附滚动条上的触摸事件 允许单击鼠标并移动以向左或向右滑动幻灯片 这很好 但我现在在滑动器内的幻灯片上调用了可拖动 这意味着我需要停止此触摸模拟 拖动幻灯片并同时移动它们会引起混乱 但仅限
  • Angular2:动态同步http请求

    Goal 发出一系列同步 http 请求并能够将它们作为一个可观察流进行订阅 示例 不工作 let query arr test1 test2 test3 function make request query arr if query a
  • 播放没有音频标签的音频

    是否可以在没有音频标签的情况下仅使用 javascript 播放音频 我通过 tinyMce 编辑器注入脚本 因为我无权访问网站的后端 并且它不支持客户端的音频标签 她只想要当您将鼠标悬停在图像上时发出简单的声音 我已经完成了所有设置 但是
  • 使用express.js动态加载路线

    我使用express js作为网络服务器 并且想要一种简单的方法来将所有 app get 和 app post 函数分开以分隔文件 例如 如果我想为登录页面指定 get 和 post 函数 我希望在动态加载的路由文件夹中有一个 login
  • 如何将MathJax公式转换为img

    Mathjax 现在在我的项目中运行良好 但有一个问题 有没有办法将MathJax的公式 纯html和css 转换成img文件 我可以保存 MathJax 可以配置为生成 SVG 看http docs mathjax org en late
  • javascript - 如何获取对象名称或关联数组索引名称?

    我有一个像这样的 JSON 对象 var list name1 element1 value1 name2 element1 value2 如何提取所有 nameX 字符串值 例如 假设我想将它们连接在一个字符串中输出 例如 name1 n
  • 当php脚本通过ajax运行时显示进度条

    我有一个通过 ajax 向服务器提交值的表单
  • 如何在 TypeScript 中使用 navigation.replace ?

    我试图在我的代码中使用它 const navigation useNavigation navigation replace AllFriends 但我不断收到错误消息 Property replace does not exist on
  • 如何跨多个文件跨越 javascript 命名空间?

    我永远忽略了javascript 几年前我开始使用 jQuery 这样我就可以过得去 但随着我开始更多地进行 TDD 我昨天决定真正深入研究 javascript 之后可能还有咖啡脚本 在我的 ASP NET Web 窗体应用程序中 我有很
  • jQuery Mobile + Admob:轮换?

    我使用 jQuery Mobile 框架创建了一个移动应用程序 所有页面都在index php中加载 使用 div 在每个页面的页脚中 我添加了Admob代码 div div div
  • Node.js - 使用 XHR 进行强大的上传

    我尝试实现一个简单的 XHR 上传到 Node js 通过强大 https github com felixge node formidable 问题是如果我设置 xhr setRequestHeader Content Type mult

随机推荐

  • 发送带有附件的电子邮件

    我有一个邮件程序如下 class Payments LateNoticesMailer lt AsyncMailer def notice payment id payment PaymentDecorator find payment i
  • 按返回不会返回到上一个片段

    我在将片段事务添加到返回堆栈时遇到问题 我有一个主要活动 其中我使用菜单片段填充布局 public class MainActivity extends ActionBarActivity Override protected void o
  • 单个表的多个外键和指向多个表的单个键

    我需要数据库设计专家的一些建议 我在一个表中有大约六个外键 缺陷 它们都指向用户表中的主键 它像是 defect assigned to created by updated by closed by 如果我想获取有关缺陷的信息 我可以进行
  • Java中pom.xml文件有什么用? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 POM 文件的主要特征是什么 为什么实际使用它 无论我们在其中提供什么 依赖项如何映射到 Java 虚拟机并在应用程序上变得灵活 项目对象
  • 如何在 MATLAB/Octave 中获得真正的整数溢出?

    我正在为 MATLAB Octave 中的一些 VHDL 代码开发验证工具 因此 我需要生成 真实 溢出的数据类型 intmax int32 1 ans 2147483648 稍后 如果我可以定义变量的位宽度 将会很有帮助 但现在这并不那么
  • 我的最近对问题的分而治之算法的逻辑有什么问题?

    我一直在关注 Coursera 的算法课程 并提出了关于最近对问题的分治算法的想法 我想澄清这一点 根据 Roughgarden 教授的算法 你可以看到here https class coursera org algo 2012 002
  • iOS:澄清不同的搜索路径

    XCode Build Settings 中有三种不同的搜索路径 框架搜索路径 标头搜索路径 库搜索路径 谁能澄清这些路径的作 用以及它们的用途吗 框架搜索路径 在哪里搜索构架 http developer apple com librar
  • 为什么 (0>1 + 0>9) 返回 False,而 ((0>1) + (0>9)) 返回 0?

    在Python中添加布尔表达式时 似乎将它们括在括号中会将它们转换为int当您添加它们时 但不这样做会保留它们的类型 gt gt gt 0 gt 1 0 gt 9 0 gt gt gt 0 gt 1 0 gt 9 False gt gt g
  • 为什么 adParamOutput 参数执行后不包含值

    我使用 ASP classic 和 ADO 连接到 SQL Server 2008 我继承了这段代码 它被严重破坏了 我将尝试重新创建相关部分 如果您需要更多详细信息或者我遗漏了某些内容 请告诉我 我创建一个命令并添加参数 oCmd Com
  • 角度材料中的结束日期 > 开始日期

    我正在构建一个组件 html css spec ts ts 以我一直想要的角度endDate gt startDate 我已关注此链接https material angular io components datepicker overv
  • 如何在 iOS 项目中添加两个或多个 kotlin 原生模块

    TL DR 如何在 iOS 项目上添加两个或多个 kotlin 原生模块而不需要获取duplicate symbols error 详细问题 让我们假设一个多模块 KMP 项目如下 其中存在一个适用于 Android 的本机应用程序和一个适
  • C# 中的 Marshall double[] 到 IntPtr?

    我正在尝试在 C 中将 double 转换为 IntPtr 这是我要转换的数据 double rotX 1 0 0 0 0 0 double rotY 0 0 1 0 0 0 double rotZ 0 0 0 0 1 0 这是我要输入 I
  • 我可以在java中将字符串解析为时间吗

    我正在使用 android text format Time 我需要一个函数来获取字符串并将该字符串转换为 Time 对象 由于其他原因 我最初将时间对象存储为字符串 我现在只需要将字符串传递到 Time 对象中即可 代码 Time tim
  • C++11“重载 lambda”,带有可变参数模板和变量捕获

    我正在研究一个 C 11 习惯用法 它可能被称为 重载 lambda http cpptruths blogspot com 2014 05 fun with lambdas c14 style part 2 html http cpptr
  • 无法通过 Unity 在 Android 上启动活动

    我正在使用 Unity 创建 Android 应用程序 我有两个插件 每个单独工作都很好 但是当我想要同时使用它们时 我无法在它们之间切换活动 在过去的十天里 我阅读了所有类似的问题 并尝试了从反编译 编辑 重新编译 Java 代码到从 U
  • 设置辅助功能上的窗口级别

    我正在开发一个 Mac OS X 应用程序 它操纵属于另一个应用程序的窗口 我为此使用辅助功能 我已经成功移动窗口并从我的应用程序查询其属性 现在我需要使窗口 始终位于顶部 基于另一个帖子 https stackoverflow com q
  • Java (JSP):在“子 jsp”中重复 contentType 标头

    当一个 jsp 中的标头重复包含在另一个 jsp 中时会发生什么情况 例如如果示例 jsp以此开始
  • 在不带“with”的情况下对 data.table 进行键控查找

    我有一个data table像这样的结构 除了我的真的很大 dt lt data table x 1 5 y 3 7 key x 我想通过以下方式查找该结构中的行another名称为的变量x 注意 与密钥的名称相同dt x lt 3 4 d
  • Google 日历 API 和 OAuth 问题

    我收到错误 com google gdata util AuthenticationException Unknown authorization header at com google gdata client http HttpGDa
  • 使用 Node.js 进行 Javascript 异步异常处理

    我目前正在开发一个 Node js 应用程序 并且遇到了常见的异步代码问题 我正在 Node 的 HTTP 模块之上实现一个服务服务器 该服务器支持 类似express 路由 例如 我的代码如下所示 server any someRoute