Node.js 完全教程:从入门到精通

Node.js 完全教程:从入门到精通

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,允许开发者在服务器端使用 JavaScript。它的非阻塞 I/O 和事件驱动架构使得 Node.js 非常适合于构建高性能的网络应用。本文将详细介绍 Node.js 的安装、基本语法、模块系统、异步编程、Express 框架、数据库操作等内容,帮助你从入门到精通 Node.js。
在这里插入图片描述

1. Node.js 简介

Node.js 是一个开源的、跨平台的 JavaScript 运行时环境,能够在服务器端执行 JavaScript 代码。它的特点包括:

  • 异步非阻塞:Node.js 使用事件驱动的非阻塞 I/O 模型,使得它能够处理大量并发请求。
  • 单线程:Node.js 运行在单线程上,但通过事件循环机制实现并发处理。
  • 高性能:得益于 V8 引擎,Node.js 执行 JavaScript 代码的速度非常快。

2. Node.js 安装

2.1 下载与安装

前往 Node.js 官方网站 下载适合你操作系统的安装包。安装过程非常简单,按照提示完成安装即可。

2.2 验证安装

打开终端(Windows 用户可以使用命令提示符),输入以下命令检查 Node.js 和 npm(Node.js 包管理器)的版本:

node -v
npm -v

如果安装成功,你将看到版本号输出。

在这里插入图片描述

3. Node.js 基本语法

3.1 Hello World 示例

创建一个新的 JavaScript 文件 app.js,并输入以下代码:

console.log("Hello, World!");

在终端中运行:

node app.js

输出结果:

Hello, World!

3.2 变量与数据类型

Node.js 支持 JavaScript 的所有基本数据类型,包括:

  • 字符串let name = "Node.js";
  • 数字let age = 25;
  • 布尔值let isNode = true;
  • 数组let fruits = ["apple", "banana", "orange"];
  • 对象let person = { name: "Alice", age: 30 };

3.3 控制结构

Node.js 支持常见的控制结构,如条件语句和循环。

3.3.1 条件语句
let age = 18;
if (age >= 18) {console.log("成年人");
} else {console.log("未成年人");
}
3.3.2 循环
for (let i = 0; i < 5; i++) {console.log(i);
}

4. 模块系统

Node.js 的模块化设计使得代码更易于维护和复用。使用 require 导入模块,使用 module.exports 导出模块。

4.1 创建模块

创建一个名为 math.js 的文件,内容如下:

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

4.2 使用模块

app.js 中使用刚刚创建的模块:

const math = require('./math');console.log(math.add(5, 3)); // 输出 8
console.log(math.subtract(5, 3)); // 输出 2

5. 异步编程

Node.js 的异步编程模型是其核心特性之一。通过回调函数、Promise 和 async/await 来处理异步操作。

5.1 回调函数

const fs = require('fs');fs.readFile('example.txt', 'utf8', (err, data) => {if (err) {console.error(err);return;}console.log(data);
});

5.2 Promise

const fs = require('fs').promises;fs.readFile('example.txt', 'utf8').then(data => {console.log(data);}).catch(err => {console.error(err);});

5.3 async/await

const fs = require('fs').promises;async function readFile() {try {const data = await fs.readFile('example.txt', 'utf8');console.log(data);} catch (err) {console.error(err);}
}readFile();

6. 创建 Web 服务器

Node.js 可以轻松创建 HTTP 服务器。以下是一个简单的服务器示例:

const http = require('http');const server = http.createServer((req, res) => {res.statusCode = 200;res.setHeader('Content-Type', 'text/plain');res.end('Hello, Node.js!\n');
});server.listen(3000, () => {console.log('服务器运行在 http://localhost:3000/');
});

在终端中运行该文件后,打开浏览器访问 http://localhost:3000/,你将看到 “Hello, Node.js!” 的输出。

在这里插入图片描述

7. 使用 Express 框架

Express 是 Node.js 最流行的 Web 应用框架之一,简化了服务器的创建和路由管理。

7.1 安装 Express

使用 npm 安装 Express:

npm install express

7.2 创建一个简单的 Express 应用

const express = require('express');
const app = express();app.get('/', (req, res) => {res.send('Hello, Express!');
});app.listen(3000, () => {console.log('Express 服务器运行在 http://localhost:3000/');
});

7.3 路由管理

app.get('/about', (req, res) => {res.send('关于页面');
});app.get('/contact', (req, res) => {res.send('联系页面');
});

8. 数据库操作

Node.js 可以与多种数据库进行交互,包括 MongoDB、MySQL、PostgreSQL 等。以下是使用 MongoDB 的示例。

8.1 安装 MongoDB 驱动

npm install mongodb

8.2 连接 MongoDB

const { MongoClient } = require('mongodb');async function main() {const uri = "mongodb://localhost:27017";const client = new MongoClient(uri);try {await client.connect();console.log("成功连接到 MongoDB");} catch (err) {console.error(err);} finally {await client.close();}
}main().catch(console.error);

8.3 CRUD 操作

async function createDocument(client, newDocument) {const result = await client.db("test").collection("users").insertOne(newDocument);console.log(`新文档创建成功:${result.insertedId}`);
}

9. 错误处理

在 Node.js 中,错误处理是非常重要的。可以使用 try...catch 语句处理同步代码中的错误,对于异步代码,可以在 Promise 中使用 .catch() 方法。

async function riskyOperation() {try {// 可能抛出错误的操作} catch (error) {console.error("发生错误:", error);}
}

10. 中间件

在 Express 中,中间件是处理请求和响应的函数。可以用于日志记录、请求解析、身份验证等。

10.1 创建中间件

app.use((req, res, next) => {console.log(`${req.method} ${req.url}`);next(); // 调用下一个中间件
});

10.2 使用现成的中间件

可以使用 body-parser 中间件解析请求体:

npm install body-parser
const bodyParser = require('body-parser');app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

11. 部署 Node.js 应用

将 Node.js 应用部署到云服务器(如 AWS、Heroku、DigitalOcean 等)是一个重要的步骤。以下是基本的部署步骤:

  1. 选择云服务提供商:选择适合的云服务提供商并创建账户。
  2. 配置服务器:根据提供商的文档配置服务器环境。
  3. 上传代码:使用 Git 或 FTP 将代码上传到服务器。
  4. 安装依赖:在服务器上运行 npm install 安装依赖。
  5. 启动应用:使用 node app.js 启动应用,或者使用 PM2 等进程管理工具保持应用运行。

在这里插入图片描述

12. 总结

本文详细介绍了 Node.js 的基础知识、模块系统、异步编程、Web 服务器创建、Express 框架、数据库操作等内容。通过示例代码和图示,帮助你更好地理解和掌握 Node.js 的使用。希望这份教程能对你学习 Node.js 有所帮助,祝你在开发中取得成功!

如果你有任何问题或建议,欢迎在评论区留言。感谢你的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/58776.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务day03

导入黑马商城项目 创建Mysql服务 由于已有相关项目则要关闭DockerComponent中的已开启的项目 [rootserver02 ~]# docker compose down WARN[0000] /root/docker-compose.yml: version is obsolete [] Running 4/4✔ Container nginx Removed …

每日一题之二叉树

已知结点元素值为正整数且值不相同的一棵二叉树。 该二叉树通过给出其先序遍历序列和中序遍历序列构造而成。 输入一个整数x&#xff0c;针对此二叉树编写程序求出x的右子树中所有结点值的和&#xff08;若x不在树上&#xff0c;输出-1&#xff09;。 输入说明&#xff1a;第一…

win10系统使用Visual Studio 2019或cmake编译SDL2为32位库时出现error C2118: 负下标winnt.h的解决方法

提示&#xff1a; 下图蓝体字中的VS2008是错误的&#xff0c;其实SDL.sln是用VS2010版本的软件开发的&#xff08;对于SDL-release-2.0.5.zip源码而言至少是这样&#xff0c;而2024-11-6为止SDL是2.30.9版本了&#xff0c;2.30.9版本则无需自己编译&#xff0c;只需下载带后缀…

推荐一款管道数据检索工具:Pipedata-Pro

Pipedata-Pro是一款专为设计石油、天然气、水和蒸汽管道及管道系统的工程师开发的应用程序。该应用程序提供了设计管道系统所需的工程数据&#xff0c;拥有一个全面的管道类型、配件和材料数据库。 软件特点&#xff1a; 1. 技术参数查询&#xff1a;Pipedata-Pro 提供关于管道…

算法竞赛(Python)-数组

文章目录 一 、排序算法二 、二分查找1 二分查找讲解2 二分查找题目&#xff08;1&#xff09;二分查找&#xff08;2&#xff09;在排序数组中查找元素的第一个和最后一个位置&#xff08;3&#xff09;两数之和 II - 输入有序数组 三、数组双指针1对撞指针对撞指针题目1&…

基于STM32的LCD1602显示Proteus仿真设计(仿真+程序+设计报告+讲解视频)

这里写目录标题 1.主要功能0. 资料清单&下载链接资料下载链接&#xff1a;2.仿真设计3. 程序设计4. 设计报告5. 框图 基于STM32的LCD1602显示Proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a…

SpringBoot项目编译报错 类文件具有错误的版本 61.0, 应为 52.0

springboot项目在编译时报错&#xff1a; /Users/Apple/Developer/art/caicai/cai-api/dubbo-samples/1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-provider/src/main/java/org/apache/dubbo/springboot/demo/provider/ProviderApplication.java:22:32 java…

PVE纵览-备份与快照指南

PVE纵览-备份与快照指南 文章目录 PVE纵览-备份与快照指南摘要1 备份与快照概述定义与区别备份与快照在PVE中的应用场景 2 PVE 备份功能详解备份类型与策略配置备份任务自动化备份管理 3 PVE 快照功能详解快照的工作原理快照的创建与恢复机制快照对系统性能的影响快照的使用场景…

Mac如何实现最简单的随时监测实时运行状态的方法

Mac book有着不同于Windows的设计逻辑与交互设计&#xff0c;使得Mac book有着非常棒的使用体验&#xff0c;但是在Mac电脑的使用时间过长时&#xff0c;电脑也会出现响应速度变慢或应用程序崩溃的情况&#xff0c;当发生的时候却不知道什么原因导致的&#xff0c;想要查询电脑…

JavaWeb合集23-文件上传

二十三 、 文件上传 实现效果&#xff1a;用户点击上传按钮、选择上传的头像&#xff0c;确定自动上传&#xff0c;将上传的文件保存到指定的目录中&#xff0c;并重新命名&#xff0c;生成访问链接&#xff0c;返回给前端进行回显。 1、前端实现 vue3AntDesignVue实现 <tem…

WPF之iconfont(字体图标)使用

1&#xff0c;前文&#xff1a; WPF的Xaml是与前端的Html有着高度相似性的标记语言&#xff0c;所以Xaml也可同Html一般轻松使用阿里提供的海量字体图标&#xff0c;从而有效的减少开发工作度。 2&#xff0c;下载字体图标&#xff1a; 登录阿里图标库网iconfont-阿里巴巴矢量…

leetcode92:反转链表||

给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#xff1a;[1,4,3,2…

Python-安装与PyCharm的安装配置(1)

目录 安装 打开运行 PyCharm的安装 新建项目 安装 找到官网下载对应的电脑对应的版本 Welcome to Python.org -- 官网 下载稳定版的 安装记得勾选配置环境&#xff0c;这样自己就不需要再配置环境了 安装成功 至此python的运行环境就安装好了 打开运行 在开始菜单中可以…

python的编程基础分支,循环与函数的应用知识

编程基础是学习任何编程语言的必备知识之一。在Python中&#xff0c;分支、循环和函数是常用的编程概念&#xff0c;它们可以让我们编写出更复杂、更灵活的程序。 分支 分支是根据条件来决定程序执行的不同路径。在Python中&#xff0c;我们使用if语句来实现分支。 if 条件:# …

qt QLocale详解

1、概述 QLocale是Qt框架中的一个类&#xff0c;用于处理与本地化相关的操作。它能够方便地实现日期、时间、数字和货币的格式化和解析&#xff0c;支持不同的语言、区域设置和字符集。QLocale提供了一种跨平台的方式来获取当前系统的语言设置&#xff0c;并返回该语言的本地化…

缓存、注解、分页

一.缓存 作用&#xff1a;应用查询上&#xff0c;内存中的块区域。 缓存查询结果&#xff0c;减少与数据库的交互&#xff0c;从而提高运行效率。 1.SqlSession 缓存 1. 又称为一级缓存&#xff0c;mybatis自动开启。 2. 作用范围&#xff1a;同一…

uniapp vue3 使用echarts-gl 绘画3d图表

我自己翻遍了网上&#xff0c;以及插件市场&#xff0c;其实并没有uniapp 上使用echarts-gl的样例&#xff0c;大多数都是使用插件市场的echarts的插件 开始自己尝试直接用echartsgl 没有成功&#xff0c;后来尝试使用threejs 但是也遇到一些问题&#xff0c;最后我看官网的时…

【言语理解】片段阅读整体概述

1.1 题型分类 片段阅读一般有以下六种&#xff1a; 中心理解题 “这段文字意在说明&#xff1a;” “这段文字意在强调&#xff1a;” “这段文字主要介绍了&#xff1a;” “下列对文意概括最恰当的是&#xff1a;”标题拟定题 “最适合做这段文字标题的是&#xff1a;”下文…

什么是 OpenTelemetry?

OpenTelemetry 定义 OpenTelemetry (OTel) 是一个开源可观测性框架&#xff0c;允许开发团队以单一、统一的格式生成、处理和传输遥测数据&#xff08;telemetry data&#xff09;。它由云原生计算基金会 (CNCF) 开发&#xff0c;旨在提供标准化协议和工具&#xff0c;用于收集…

ESP32 gptimer通用定时器初始化报错:assert failed: timer_ll_set_clock_prescale

背景&#xff1a;IDF版本V5.1.2 &#xff0c;配置ESP32 通用定时器&#xff0c;实现100HZ&#xff0c;占空比50% 的PWM波形。 根据乐鑫官方的IDF指导文档设置内部计数器的分辨率&#xff0c;计数器每滴答一次相当于 1 / resolution_hz 秒。 &#xff08;ESP-IDF编程指导文档&a…