Node.JS - 基础(示例代码)

目录

A. Hello

1.创建js文件

2.编写代码

3.编译

4.输出结果

B. 建立HTTP服务器

C. 异步式 I/O 与事件式编程

D. 模块和包

E. 调试



A. Hello

1.创建js文件

使用VSCode创建一个.js文件,比如

2.编写代码

打印log

console.log("Hello");

3.编译

4.输出结果

B. 建立HTTP服务器

代码

var http = require('http');

http.createServer(function(req,res){
res.writeHead(200,{'Content-Type':'text/html'});
res.write('<h1>Hello</h1>');
res.write('<p>world</p>');
}).listen(3000);

console.log("HTTP server is listening at port 3000.");

运行

要是原来设置过配置别忘了改一下启动

运行结果

网页打开

127.0.0.1:3000

也可以直接用命令行启动

在 app.js 的文件夹下 启动命令行

输入 node app.js

ps 小技巧 安装 supervisor 自动检测代码改动.重启nodejs

C. 异步式 I/O 与事件式编程

Node.js 的异步式 I/O 和事件式编程是其核心特性,对高效处理并发任务等方面起着关键作用。

一、异步式 I/O

  1. 基本概念

    • 在传统的同步 I/O 模型中,当程序执行一个 I/O 操作(如读取文件、网络请求等)时,程序会一直等待该操作完成后才继续执行下一步。而异步 I/O 则不同,当发起一个 I/O 操作后,程序不会等待其完成,而是继续执行后续代码。当 I/O 操作完成时,系统会通过某种方式通知程序,然后程序再去处理该 I/O 操作的结果。
    • 例如,在一个 Web 应用中,当用户请求一个网页时,服务器可能需要从数据库读取数据来生成页面内容。如果使用同步 I/O,服务器会一直等待数据库查询完成后才能返回网页给用户,这期间会阻塞其他用户的请求处理。而使用异步 I/O,服务器在发起数据库查询后就可以立即处理其他任务,当数据库查询完成后,再通过回调函数等方式来处理查询结果并生成网页返回给用户。
  2. 工作原理与优势

    • Node.js 实现异步 I/O 的方式是基于事件循环和回调函数。当发起一个异步 I/O 操作时,Node.js 会将该操作交给底层的操作系统或相关的 I/O 库去处理,并注册一个回调函数。当 I/O 操作完成时,操作系统或 I/O 库会触发相应的事件,Node.js 的事件循环会检测到这个事件并调用注册的回调函数来处理结果。
    • 这种方式的优势在于能够高效地处理大量并发的 I/O 操作。因为它不会因为一个耗时的 I/O 操作而阻塞整个程序的执行,所以可以同时处理多个 I/O 请求,提高了系统的吞吐量和响应速度。例如,在一个在线聊天应用中,服务器需要同时处理多个用户的消息发送和接收,如果使用异步 I/O,服务器可以快速响应每个用户的操作,而不会因为某个用户的网络延迟等问题而影响其他用户的体验。

二、事件式编程

  1. 基本概念

    • 事件式编程是一种基于事件触发和处理的编程范式。在 Node.js 中,事件主要来源于异步 I/O 操作的完成、网络连接的建立与关闭、定时器触发等。当这些事件发生时,程序会相应地执行与之关联的事件处理函数(也称为回调函数)。
    • 例如,在一个文件上传服务器中,当有文件上传完成的事件发生时,程序会触发一个“文件上传完成”的事件,然后执行相应的处理函数来保存文件、验证文件格式等操作。
  2. Node.js 中的事件模型

    • Node.js 内置了事件模块events,它提供了一个简单的事件发射器(Event Emitter)模式的实现。开发者可以使用events模块来创建自定义事件和处理函数。
    • 例如,以下是一个简单的使用events模块的示例代码:
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('触发了 event 事件');
});
myEmitter.emit('event');

在这个例子中,创建了一个自定义的事件发射器MyEmitter,并为event事件注册了一个处理函数。当调用emit('event')时,就会触发该事件并执行相应的处理函数。

  1. 事件式编程的优势与应用场景
    • 优势:
      • 事件式编程使得程序结构更加清晰和模块化。不同的事件处理逻辑可以分离在不同的函数中,便于代码的维护和扩展。例如,在一个电商网站的服务器端,对于用户下单、支付成功、退款等不同的事件,可以分别编写独立的事件处理函数,当业务逻辑发生变化时,只需要修改相应的事件处理函数即可,而不会影响其他部分的代码。
      • 它非常适合处理异步操作的结果。由于 Node.js 的异步特性,很多操作的结果是通过事件来通知的。使用事件式编程可以方便地处理这些异步操作完成后的后续逻辑。比如在网络应用中,当接收到客户端的请求时,可以触发一个“请求接收”事件,然后通过不同的事件处理函数来处理请求、验证用户身份、查询数据库等操作,每个操作都可以作为一个独立的事件处理环节。
    • 应用场景:
      • 在 Web 服务器中,当有新的客户端连接时会触发一个连接事件,服务器可以通过相应的事件处理函数来处理客户端的请求和数据传输。例如,使用 Express 框架构建的 Web 服务器,当接收到 HTTP 请求时,会触发一系列与请求处理相关的事件,开发者可以通过注册中间件函数(本质上也是事件处理函数)来处理请求的路由、数据解析、错误处理等操作。
      • 在实时应用中,如在线游戏或实时监控系统,当有新的数据更新或用户操作时,可以通过事件来实时通知其他相关模块进行处理。例如,在一个多人在线游戏中,当一个玩家的位置发生变化时,服务器可以触发一个“玩家位置更新”事件,然后将该位置信息发送给其他相关玩家的客户端,实现实时同步。

总的来说,Node.js 的异步式 I/O 和事件式编程相互配合,使得 Node.js 能够高效地处理大量并发任务,特别适合构建高性能的网络应用、实时系统等。开发者通过合理利用这两个特性,可以构建出响应迅速、可扩展性强的应用程序。

D. 模块和包

在 Node.js 中,模块和包是构建应用程序的重要组成部分。

一、模块

  1. 定义与作用

    • 模块是 Node.js 应用程序的基本组成单位,它是一段可以被重复使用的代码。模块的作用在于将复杂的应用程序分解成小的、可管理的单元,每个单元负责特定的功能,提高代码的可维护性、可复用性和可读性。
    • 例如,在一个电商网站的后端应用中,可能有一个模块负责处理用户认证,另一个模块负责与数据库交互来管理商品信息。这样,当需要修改用户认证的逻辑时,只需要关注相应的模块代码,而不会影响到其他不相关的部分。
  2. 分类

    • 核心模块:Node.js 自带的一些模块,提供了基本的功能,无需额外安装即可在应用程序中使用。例如fs模块用于文件操作,http模块用于创建 HTTP 服务器等。
    • 文件模块:开发者自己创建的 JavaScript 文件模块。这些模块可以包含特定的功能代码,通过合适的方式在应用程序中被引入和使用。例如,创建一个名为mathUtils.js的文件模块,里面包含一些数学计算的函数,如加法、减法等,然后在其他文件中可以引入这个模块来使用这些函数。
    • 第三方模块:由社区或其他开发者创建并发布到 npm(Node Package Manager)仓库的模块。这些模块涵盖了各种各样的功能,如前面提到的 Express 框架就是一个非常流行的第三方模块,用于构建 Web 应用和 API。
  3. 模块的导入与导出

    • 在 Node.js 中,使用require函数来导入其他模块。例如,如果有一个名为myModule.js的文件模块,在另一个文件中可以通过const myModule = require('./myModule.js')来导入该模块(这里假设myModule.js与当前文件在同一目录下)。
    • 模块的导出可以通过module.exportsexports对象来实现。例如,在myModule.js中,可以这样导出一个函数:
   function add(a, b) {
     return a + b;
   }
   module.exports = add;

或者

   exports.subtract = function(a, b) {
     return a - b;
   }

这样,在其他文件中导入该模块后就可以使用导出的函数了。

二、包

  1. 定义与组成

    • 包是在模块的基础上构建的,它是一个包含多个模块以及相关配置文件的集合。包通常具有一定的层次结构,并且可能依赖于其他包。一个包可以看作是一个功能更完整、更复杂的代码单元,用于解决特定领域的问题或提供一组相关的功能。
    • 例如,Express 包就是一个包含了多个模块用于构建 Web 应用的包。它不仅有处理路由的模块,还有处理中间件、模板引擎等相关功能的模块,并且有自己的配置文件和依赖关系。
  2. 包的管理

    • 如前面提到的,Node.js 使用 npm 来管理包。通过 npm,开发者可以方便地安装、更新和卸载包。
    • 当安装一个包时,npm 会自动解决包的依赖关系,即如果安装的包依赖于其他包,npm 会自动下载并安装这些依赖包。例如,安装 Express 包时,npm 会自动安装 Express 所依赖的其他包,并将它们放置在项目的node_modules目录下。
    • 在项目的package.json文件中,记录了项目所依赖的包及其版本信息。这样,当其他开发者或在不同环境中安装这个项目时,只需要运行npm install命令,npm 就会根据package.json中的配置自动安装所有需要的包及其正确的版本。
  3. 创建和发布包

    • 开发者可以创建自己的包并发布到 npm 仓库供其他人使用。创建一个包通常包括以下步骤:
    • 首先,组织好包的代码结构,包括包含模块的文件、配置文件等。
    • 然后,在项目根目录下创建一个package.json文件,用于描述包的名称、版本、作者、依赖关系等信息。
    • 可以通过npm init命令来初始化package.json文件,并根据提示输入相关信息。
    • 接下来,编写测试用例来确保包的功能正确性(可选但推荐)。
    • 最后,使用npm publish命令将包发布到 npm 仓库。发布前需要确保已经注册了 npm 账号并且登录。

总之,Node.js 的模块和包是构建复杂应用程序的重要基石。通过合理地使用模块和包,开发者可以提高代码的质量和开发效率,同时也能充分利用社区的资源来快速构建功能强大的应用程序。

E. 调试

在 Node.js 中进行调试有多种方法,以下是一些常见的调试方式:

一、使用 Node.js 内置调试器

  1. 启动调试会话

    • 可以通过在命令行中使用node命令的调试模式来启动调试会话。例如,假设你有一个名为app.js的 Node.js 应用程序文件,你可以在命令行中输入node --inspect app.js来启动应用程序并进入调试模式。这将在默认的调试端口(通常是 9229)上启动调试服务器。
    • 另外,你也可以使用node --inspect-brk app.js,它会在应用程序的第一行代码处暂停执行,这对于在应用程序启动时就开始调试非常有用。
  2. 在浏览器中进行调试

    • 当你启动了 Node.js 的调试模式后,可以在浏览器中打开 Chrome 浏览器(因为它对 Node.js 调试有很好的支持),并在地址栏中输入chrome://inspect。在打开的页面中,你应该能够看到你的正在运行的 Node.js 应用程序,点击“inspect”链接即可在 Chrome 的开发者工具中进行调试。
    • 在开发者工具中,你可以像调试网页 JavaScript 代码一样进行操作。你可以设置断点、单步执行代码、查看变量的值等。例如,当你在代码中设置了一个断点后,当程序执行到该断点处时,程序会暂停执行,你可以查看此时相关变量的值,了解程序的运行状态,帮助你找出代码中的问题。

二、使用 VS Code 进行调试

  1. 配置调试环境

    • 在 VS Code 中,首先需要创建一个launch.json文件来配置调试环境。点击 VS Code 左侧的调试图标,然后点击齿轮图标选择“创建 launch.json 文件”,在弹出的菜单中选择“Node.js”环境。这将在项目的.vscode目录下创建一个launch.json文件,其中包含了一些默认的调试配置。
    • 你可以根据自己的需求修改这个文件。例如,你可以设置program属性为你的 Node.js 应用程序文件的路径,如"program": "${workspaceFolder}/app.js"
  2. 开始调试

    • 在配置好launch.json文件后,你可以在 VS Code 中通过点击调试工具栏上的绿色三角形(开始调试按钮)来启动调试会话。VS Code 会根据你的配置启动 Node.js 应用程序并进入调试模式。
    • 在调试过程中,你可以在 VS Code 的调试面板中查看变量的值、调用堆栈等信息。你还可以在代码编辑器中看到设置的断点,并且可以通过点击调试工具栏上的按钮进行单步执行、继续执行等操作。例如,当你发现程序在某个函数中出现问题时,你可以单步执行该函数中的代码,逐行分析代码的执行情况,找出问题所在。

三、使用第三方调试工具

  1. Node Inspector Manager(NIM)

    • NIM 是一个用于简化 Node.js 调试的工具。它提供了一个命令行界面,方便你管理和启动调试会话。
    • 安装 NIM 后,你可以在命令行中使用nim start app.js来启动一个名为app.js的应用程序的调试会话。NIM 会自动处理一些配置和启动细节,使得调试过程更加简单。它还支持一些高级功能,如同时调试多个 Node.js 进程等。
    • 例如,在一个复杂的项目中,可能有多个 Node.js 脚本在不同的进程中运行,NIM 可以帮助你方便地管理和调试这些进程,而不需要手动处理多个调试会话的配置。
  2. 其他调试工具

    • 还有一些其他的第三方调试工具,如 StrongLoop Arc。它提供了一个可视化的界面,用于监控和调试 Node.js 应用程序。你可以通过它查看应用程序的性能指标、实时日志等信息,并且可以在代码中设置断点进行调试。
    • 这些工具通常提供了一些额外的功能和特性,以满足不同的调试需求。例如,在一个大型的 Node.js 项目中,StrongLoop Arc 可以帮助你更好地理解应用程序的整体架构和性能情况,通过其可视化界面快速定位可能存在的问题区域。

在调试 Node.js 应用程序时,需要根据具体的项目需求和个人习惯选择合适的调试方式。无论是使用内置调试器、VS Code 还是第三方工具,目的都是为了更高效地找出代码中的问题,提高应用程序的质量和稳定性。

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一然明月(全栈)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值