《写给PHP开发者的Node.js学习指南》一1.2 堆栈追踪

简介:

本节书摘来自异步社区《写给PHP开发者的Node.js学习指南》一书中的第1章,第1.1节,作者【美】Daniel Howard,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.2 堆栈追踪

写给PHP开发者的Node.js学习指南
在转换过程中,会看到很多的堆栈信息,非常之多。以下示例显示了运行httpsvr.njs时,node-static npm包未安装导致的错误以及生成的堆栈信息:


f88e537eaca6a3a529da8622f027ca105dd5f119

堆栈信息的最上面一行显示了抛出异常的代码所在。这并不是产生错误的代码,而是创建并抛出error对象的代码。

这行之后,显示的是Error对象内部的错误信息。这个错误信息告诉了我们没有找到node-static模块。

其余的部分称为“调用栈”,是一系列由“at”开头的链式函数调用,直到到达抛出异常的代码。调用栈按照从内到外的顺序排列。在本例中,Function._resolveFilename()函数是调用栈的最顶端,表示它是最内层调用的函数,直接包含了抛出异常的代码。._resolveFilename()函数被Function._load()函数调用,该函数又被Module.require()函数调用,Module.require()又被require()函数函数,再上层就是Object.()函数,依次类推。

在调用栈中每个函数的调用之后,你都会看到包含该函数的源文件名,最后一行执行的代码(可能是调用函数之前的一行或者抛出异常的那行),以及该行代码中最后的执行位置。在上个例子中,可以看到涉及的两个文件是:module.js和httpsvr.njs。

module.js文件存在于node命令中,我们并不认为这是属于我们自己的代码文件,而httpsvr.njs则是我们自己的源代码。尽管调用栈中只显示了一次httpsvr.njs,但是可以认为引起错误的是我们自己的代码。一般来说,我们认为Node.js本身,其内建的模块,和其他安装好的npm模块都是安全可靠的。即使它们不是,我们也必须假定它们是正常工作的,除非我们证明排除了所有由我们的代码产生错误的可能。但是,即使我们发现了错误是由其他原因导致的,我们能控制的也只有我们自己的源代码。解决方式也应该是在我们的代码中找到变通方案而不是通过漫长而缓慢的过程找到其他开发人员来修改他们的代码。所以,结果是,不管最终的错误是什么,首先需要关注的都是httpsvr.njs文件。

我们需要关注的调用栈中的部分是:


7889e66136fb3c580e0173abc6401d58b5a8852a

函数调用在httpsvr.njs的第2行第14个位置。Httpsvr.njs文件为:


0a6c7fc7e2843419d6466fcbc8b3945637378c27

通过在源代码中交叉引用调用,用于加载的node-static模块的require()函数就是错误发生的地方。这和错误信息“Cannot find module ‘node-static’”一致。

如果我们再看看调用栈,可以看到栈上方的Function._load()函数和._resolveFilename()函数。看看这两个函数名,我们可以猜测Node.js环境加载该模块出错是因为找不到与模块相关的文件。所以可以做出假设找不到模块文件(可能是npm包)是因为模块没有安装。再一次,这验证了错误信息“Cannot find module ‘node-static’”。

Object.函数暗示我们,require()函数的调用是在全局范围内,而不是httpsvr.njs用户自定义范围。但是事实并不一定都是这样。一个匿名对象也有可能在用户自定义的函数内生成。但是,继续看调用栈,在Object.函数调用之后,我们看到调用者是module.js中的Module._compile函数。所以,require()函数是全局范围内的调用。

综合以上所有信息,一个解决方案是安装node-static npm package:


31494a4d3d97d6c97f536dbfb78ba5d85485507e

诚然,不需要每次在看Node.js调用栈时都做这些分析。但是你可能会看到很多很多的调用栈,你应该知道如何进行分析——特别是因为找到并修复错误占据了转换过程95%的时间。

总结一下,分析一个调用栈信息的过程是:找到错误,查看错误信息(如果有的话),做出假设并关注在自己代码中的特定函数调用,阅读代码并找出错误可能产生的位置,查看调用栈是否包含更多错误的可能信息,根据堆栈信息理解服务器如何执行到该调用函数。

相关文章
|
11天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
15天前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
|
12天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入探索与实践在软件开发的广袤天地中,PHP以其独特的魅力和强大的功能,成为无数开发者手中的得力工具。而在这条充满挑战与机遇的征途上,设计模式犹如一盏明灯,指引着我们穿越代码的迷雾,编写出更加高效、灵活且易于维护的程序。今天,就让我们聚焦于设计模式中的璀璨明珠——策略模式,深入探讨其在PHP中的实现方法及其实际应用价值。
策略模式,这一设计模式的核心在于它为软件设计带来了一种全新的视角和方法。它允许我们在运行时根据不同情况选择最适合的解决方案,从而极大地提高了程序的灵活性和可扩展性。在PHP这门广泛应用的编程语言中,策略模式同样大放异彩,为开发者们提供了丰富的创作空间。本文将从策略模式的基本概念入手,逐步深入到PHP中的实现细节,并通过一个具体的实例来展示其在实际项目中的应用效果。我们还将探讨策略模式的优势以及在实际应用中可能遇到的挑战和解决方案,为PHP开发者提供一份宝贵的参考。
|
15天前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
|
14天前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。
|
2月前
|
存储 前端开发 JavaScript
深入理解JavaScript调用堆栈
【8月更文挑战第20天】
51 3
|
2月前
|
JSON JavaScript 前端开发
震惊!JS如何悄无声息追踪你的每一步?揭秘页面访问与关闭的超级上报大法,让数据说话,优化体验不再难!
【8月更文挑战第4天】在Web开发中,跟踪用户行为对提升体验与留存至关重要。本文以在线学习平台为例,介绍如何用JavaScript监听页面访问及关闭,并上报数据。通过`window.onload`监测页面加载,记录用户访问;利用`navigator.sendBeacon`在用户离开时发送少量数据至服务器,无需担心请求失败。需注意隐私合规、性能影响及浏览器兼容性。此技术有助于深入理解用户行为,为产品迭代提供依据。
76 8
|
2月前
|
JavaScript PHP 开发者
PHP中的异常处理与自定义错误处理器构建高效Web应用:Node.js与Express框架实战指南
【8月更文挑战第27天】在PHP编程世界中,异常处理和错误管理是代码健壮性的关键。本文将深入探讨PHP的异常处理机制,并指导你如何创建自定义错误处理器,以便优雅地管理运行时错误。我们将一起学习如何使用try-catch块捕获异常,以及如何通过set_error_handler函数定制错误响应。准备好让你的代码变得更加可靠,同时提供更友好的错误信息给最终用户。
|
2月前
|
安全 编译器 API
【颠覆想象!】PHP 8横空出世:全新特性重塑Web开发格局,开发者必看的革命性变革之旅!
【8月更文挑战第7天】PHP 8通过引入一系列创新特性和改进,不仅提升了开发者的生产力,还加强了PHP作为现代Web开发语言的地位。随着PHP社区继续推动语言的发展,我们可以期待更多令人兴奋的变化。
48 0
|
5月前
|
PHP 开发工具 开发者
PHP 8.1的新特性及其对开发者的影响
PHP 8.1作为最新版本的PHP,引入了一系列新特性和改进,包括联合构造器、enum枚举、非阻塞stream_select()函数等。本文将深入探讨这些新特性,并分析它们对PHP开发者的影响,以及如何充分利用这些特性提升代码质量和开发效率。