node的使用

embedded/2024/10/22 21:33:20/

Node.js 是一个基于 Chrome V8 引擎构建的 JavaScript 运行环境,主要用于服务器端开发。它使用非阻塞、事件驱动的 I/O 模型,能够处理大量的并发请求,特别适合于构建高性能的网络应用。下面是关于 Node.js 的一些核心概念和常见使用场景的介绍:

核心特点:

  1. 异步与事件驱动:Node.js 的 I/O 操作(文件、网络等)是异步的,通过事件循环机制进行任务调度,避免了传统的阻塞式操作,提高了性能。
  2. 单线程架构:虽然 Node.js 是单线程的,但通过事件循环和异步 I/O 实现了并发处理。即使是单线程,Node.js 也能处理大量并发请求。
  3. NPM(Node Package Manager):Node.js 附带的包管理工具,允许开发者快速安装、共享和管理各种第三方库和工具。
  4. 跨平台:Node.js 能在多种平台上运行,包括 Windows、macOS 和 Linux。
  5. 模块化系统:通过 requiremodule.exports 来实现模块的导入与导出,使得代码更加结构化、易维护。

Node.js 常见使用场景:

  1. Web 服务器:Node.js 可以轻松创建高效的 HTTP 服务器,常与 Express、Koa 等框架结合使用。
  2. API 服务:Node.js 非常适合构建 RESTful API 或 GraphQL API。
  3. 实时应用:如聊天室、实时协作工具等,得益于它的事件驱动架构,可以高效地处理 WebSocket 连接。
  4. 命令行工具:许多 CLI 工具都是基于 Node.js 构建的,比如 Webpack、Vite 等构建工具。
  5. 微服务:在微服务架构中,Node.js 的轻量特性和快速响应能力使得它非常适合用于构建微服务。

安装和基础用法:

安装 Node.js:

可以从 Node.js 官网 下载对应操作系统的安装包,并通过以下命令确认是否安装成功:

node -v
npm -v
创建一个简单的 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 World\n');
});server.listen(3000, () => {console.log('Server running at http://localhost:3000/');
});
使用 NPM 安装依赖:

NPM 是 Node.js 的包管理器,可以通过以下命令来初始化一个项目并安装依赖:

npm init -y  # 初始化项目,生成 package.json
npm install express  # 安装 Express 框架
使用 Express 创建 Web 服务器:

Express 是一个常用的 Node.js Web 框架,用于简化服务器端开发。以下是使用 Express 创建服务器的例子:

const express = require('express');
const app = express();app.get('/', (req, res) => {res.send('Hello World!');
});app.listen(3000, () => {console.log('Server is running on http://localhost:3000');
});

常见的 Node.js 模块:

  • fs(文件系统):用于文件的读写操作。
  • httphttps:用于创建服务器和处理 HTTP/HTTPS 请求。
  • path:用于处理文件路径。
  • events:Node.js 的核心模块,用于实现事件驱动。

Node.js 的优缺点:

优点:

  1. 异步非阻塞,高并发性能优秀。
  2. 社区活跃,有大量可用的第三方库和工具。
  3. 前后端统一使用 JavaScript,降低了语言的学习成本。

缺点:

  1. 单线程模型使得 CPU 密集型任务的处理效率较低。
  2. 回调地狱(虽然现在通过 Promiseasync/await 可以很好地解决这个问题)。
  3. 没有内置多线程处理,需要借助 Worker Threads 或外部库。

总结来说,Node.js 非常适合 I/O 密集型应用,比如网络服务器、API 网关、实时应用等。但如果是 CPU 密集型任务,可能需要借助其他技术来辅助。


Node.js 构建 Web 服务的常用框架有很多,最著名的包括 ExpressKoaHapi 等。下面将介绍这些框架的基本特点、使用方法和适用场景。

1. Express

Express 是最流行、最广泛使用的 Node.js Web 框架之一。它轻量、灵活且功能强大,非常适合快速构建 API 和 Web 应用程序。

特点:
  • 简洁轻量:Express 核心非常简洁,不强制使用特定的开发模式,灵活性高。
  • 中间件:Express 中间件系统强大,开发者可以在请求处理过程中插入任意逻辑。
  • 丰富的社区生态:有大量的第三方中间件和插件可以扩展功能。
安装:
npm install express
示例代码:创建简单的 Web 服务器
const express = require('express');
const app = express();app.get('/', (req, res) => {res.send('Hello, Express!');
});app.listen(3000, () => {console.log('Server running at http://localhost:3000');
});
中间件使用:
// 使用全局中间件
app.use((req, res, next) => {console.log('Time:', Date.now());next();  // 调用 next() 继续执行下一个中间件
});
适用场景:
  • 构建 RESTful API
  • 单页面应用的后端
  • 使用模板引擎生成动态网页

2. Koa

Koa 是由 Express 原班人马开发的一个新框架,旨在更现代化的 Web 应用开发。它抛弃了回调函数的使用,转而依赖 async/await 来简化异步代码,降低嵌套复杂性。

特点:
  • 简洁优雅:Koa 的设计非常精简,减少了核心中的功能,只保留了 Web 应用开发的最基础部分。
  • 原生支持 async/await:相较于 Express,Koa 更加适合现代异步 JavaScript 编程风格,减少回调地狱。
  • 高度定制化:Koa 没有内置的路由等功能,这意味着开发者可以通过插件或手动编写代码来实现特定的功能,定制性强。
安装:
npm install koa
示例代码:创建简单的 Web 服务器
const Koa = require('koa');
const app = new Koa();app.use(async (ctx) => {ctx.body = 'Hello, Koa!';
});app.listen(3000, () => {console.log('Server running at http://localhost:3000');
});
适用场景:
  • 高度自定义的 Web 应用
  • 高并发 API 接口,特别适合使用 async/await 的异步代码
  • 现代化架构设计,注重极简和高性能

3. Hapi

Hapi 是一个功能更全面的框架,提供了一套完整的插件系统和配置功能。它通常用于构建企业级应用,特别是在需要复杂路由、身份验证等功能时表现良好。

特点:
  • 插件系统:Hapi 的插件系统非常强大,方便构建模块化、可扩展的应用。
  • 丰富的功能内置:相比 Express 和 Koa,Hapi 内置了更多的功能,比如路由、缓存、验证等。
  • 安全性:Hapi 非常注重安全性,提供了许多内置的安全特性。
安装:
npm install @hapi/hapi
示例代码:创建简单的 Web 服务器
const Hapi = require('@hapi/hapi');const init = async () => {const server = Hapi.server({port: 3000,host: 'localhost'});server.route({method: 'GET',path: '/',handler: (request, h) => {return 'Hello, Hapi!';}});await server.start();console.log('Server running at:', server.info.uri);
};init();
适用场景:
  • 构建企业级应用
  • 需要严格的安全性和架构约束
  • 大型项目或微服务架构

4. Fastify

Fastify 是一个注重性能的 Node.js 框架,它的目标是提供比 Express 更高的性能,并且保持同样的开发体验。Fastify 使用 JSON Schema 来验证输入和输出,有助于提高处理速度。

特点:
  • 高性能:Fastify 是针对性能进行优化的,特别适合需要处理大量请求的应用。
  • JSON Schema 验证:通过 JSON Schema 验证请求和响应的数据格式,简化了数据验证的过程。
  • 插件架构:与 Hapi 类似,Fastify 也拥有插件化的架构,便于扩展功能。
安装:
npm install fastify
示例代码:创建简单的 Web 服务器
const fastify = require('fastify')({ logger: true });fastify.get('/', async (request, reply) => {return { hello: 'Fastify' };
});fastify.listen(3000, (err, address) => {if (err) throw err;fastify.log.info(`Server listening at ${address}`);
});
适用场景:
  • 高性能 API
  • 需要使用 Schema 进行数据验证的应用
  • 构建轻量、快速响应的 Web 服务

5. NestJS

NestJS 是一个适合构建可扩展的服务器端应用的框架,基于 TypeScript 构建,并受到 Angular 的启发,因此具有模块化、依赖注入等特点。

特点:
  • 模块化架构:NestJS 将应用组织成模块,适合大型项目。
  • TypeScript 支持:原生支持 TypeScript,适合需要严格类型检查的项目。
  • 集成性强:与 Express 和 Fastify 兼容,允许使用它们作为底层框架。
安装:
npm install @nestjs/core @nestjs/common rxjs
示例代码:创建简单的 Web 服务器
import { Controller, Get } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';@Controller()
class AppController {@Get()getHello(): string {return 'Hello, NestJS!';}
}@Module({controllers: [AppController],
})
class AppModule {}async function bootstrap() {const app = await NestFactory.create(AppModule);await app.listen(3000);
}bootstrap();
适用场景:
  • 构建企业级、可扩展的应用
  • 需要模块化、依赖注入的项目
  • 需要与 Express 或 Fastify 兼容的大型应用

Web 服务框架对比表格

特性ExpressKoaHapiFastifyNestJS
核心理念轻量灵活,易于扩展极简主义,原生支持 async/await安全性高,插件化架构高性能,基于 Schema 的验证模块化、依赖注入,TypeScript 原生
开发风格中间件链式处理基于 async/await 处理函数完全插件化,强约束的开发模式JSON Schema 验证,注重性能模块化开发,受 Angular 启发
中间件支持大量现成中间件自定义灵活中间件插件系统,提供更多内置功能支持插件式开发内置和第三方中间件丰富
性能中等性能,灵活但稍有开销性能略高于 Express性能中等,功能丰富但较重性能极高,优化对大流量的处理性能较高,使用底层 Fastify/Express
路由管理简单易用,配置自由更简洁的路由处理方式高度模块化和可配置的路由路由速度非常快路由层级清晰,模块化
扩展性社区生态非常丰富,扩展性好依赖社区插件,扩展灵活性强插件系统非常强大,适合企业级应用基于插件和 Schema 设计,扩展性强高度模块化,适合大规模应用
安全性需要手动管理中间件的安全手动控制中间件内置了很多安全机制需要配置,但性能和安全兼顾内置多种安全特性
类型支持JavaScript,支持 TypeScriptJavaScript,支持 TypeScriptJavaScript,支持 TypeScriptJavaScript,支持 TypeScriptTypeScript 原生支持
学习难度简单易学简洁,但自定义需要学习学习曲线稍高,配置较复杂简单易学,性能调优需要掌握学习曲线较陡,但适合复杂应用
适用场景快速开发 API 和 Web 应用需要现代异步处理的 API 应用需要高度安全、插件化的企业级应用需要高性能、低延迟的 API 应用需要构建大型、复杂、可扩展的项目
优势灵活,易于扩展,社区支持广泛简洁优雅,支持 async/await安全性高,功能丰富,插件化强高性能,插件和 Schema 设计模块化、依赖注入,开发体验好
缺点回调地狱,手动管理安全性需要更多配置和第三方插件较为重量级,配置复杂需要学习 JSON Schema 验证学习成本较高,适合大型项目
常见应用中小型 Web 应用、API 服务异步处理、高并发 API大型企业级 Web 应用大型 API 应用,实时数据处理大型企业级应用,复杂微服务架构

总结

  • Express:轻量灵活,适合中小型应用和 API。
  • Koa:简洁现代,适合需要高度自定义的应用。
  • Hapi:功能全面,适合企业级应用,安全性高。
  • Fastify:高性能框架,适合处理大量请求的应用。
  • NestJS:模块化和类型安全,适合构建复杂的、可扩展的大型应用。

根据应用的需求选择合适的框架,可以帮助你在开发中提高效率。


在 Node.js 中,处理和检索不同的数据类型是开发中常见的需求。通常我们会处理 文件系统数据数据库数据(如 MySQL、MongoDB 等)以及与 缓存系统(如 Redis)相关的数据。不同的场景和需求会用到不同的库和技术,下面我将介绍几种常见的数据存储和检索服务,以及如何在 Node.js 中使用它们。

1. 文件系统数据操作

Node.js 提供了内置的 fs 模块,用于与文件系统交互,读取、写入、删除文件,以及操作文件目录。

读取文件
const fs = require('fs');// 异步读取文件
fs.readFile('example.txt', 'utf8', (err, data) => {if (err) {console.error(err);return;}console.log(data);
});// 同步读取文件
const data = fs.readFileSync('example.txt', 'utf8');
console.log(data);
写入文件
const content = 'Some content to write';// 异步写入文件
fs.writeFile('example.txt', content, err => {if (err) {console.error(err);return;}console.log('File written successfully');
});// 同步写入文件
fs.writeFileSync('example.txt', content);
console.log('File written successfully');
删除文件
fs.unlink('example.txt', err => {if (err) {console.error(err);return;}console.log('File deleted successfully');
});
适用场景:
  • 处理静态数据,如配置文件、日志文件
  • 文件上传、下载
  • 静态资源管理

2. 使用 MySQL 数据库

MySQL 是一种常见的关系型数据库,Node.js 可以通过 mysql2sequelize 等库进行连接和操作。

安装 mysql2
npm install mysql2
创建连接并执行查询
const mysql = require('mysql2');// 创建数据库连接
const connection = mysql.createConnection({host: 'localhost',user: 'root',password: 'password',database: 'test'
});// 连接到数据库
connection.connect(err => {if (err) {console.error('Error connecting to the database:', err);return;}console.log('Connected to MySQL');
});// 执行查询
connection.query('SELECT * FROM users', (err, results) => {if (err) {console.error('Error executing query:', err);return;}console.log('Data:', results);
});// 关闭连接
connection.end();
使用 Sequelize ORM

Sequelize 是 Node.js 中常用的 ORM 库,可以简化与数据库的交互。它支持多种数据库,如 MySQL、PostgreSQL、SQLite 等。

npm install sequelize mysql2
const { Sequelize, DataTypes } = require('sequelize');// 创建 Sequelize 实例
const sequelize = new Sequelize('test', 'root', 'password', {host: 'localhost',dialect: 'mysql'
});// 定义模型
const User = sequelize.define('User', {name: {type: DataTypes.STRING,allowNull: false},email: {type: DataTypes.STRING,allowNull: false}
});// 同步模型并插入数据
sequelize.sync().then(() => {return User.create({name: 'John Doe',email: 'john.doe@example.com'});
}).then(user => {console.log(user.toJSON());
});
适用场景:
  • 数据复杂度较高,使用关系型数据库结构化数据
  • 需要事务管理、复杂的查询
  • 需要数据表的关系管理(外键、联合查询等)

3. 使用 MongoDB

MongoDB 是一个文档型 NoSQL 数据库,Node.js 可以通过官方的 mongodb 驱动或 Mongoose 库来进行操作。

安装 MongoDB 驱动
npm install mongodb
使用 MongoDB 驱动连接和操作数据库
const { MongoClient } = require('mongodb');// MongoDB 连接 URI
const uri = 'mongodb://localhost:27017';// 创建 MongoClient 实例
const client = new MongoClient(uri);async function run() {try {await client.connect();console.log('Connected to MongoDB');const database = client.db('test');const collection = database.collection('users');// 插入文档const doc = { name: 'Alice', age: 30 };const result = await collection.insertOne(doc);console.log(`Inserted document with _id: ${result.insertedId}`);// 查询文档const user = await collection.findOne({ name: 'Alice' });console.log('User found:', user);} finally {await client.close();}
}run().catch(console.dir);
使用 Mongoose ORM

Mongoose 提供了 MongoDB 的 ORM 功能,可以通过定义模式来操作 MongoDB 数据。

npm install mongoose
const mongoose = require('mongoose');// 连接 MongoDB
mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true, useUnifiedTopology: true });// 定义 Schema 和模型
const userSchema = new mongoose.Schema({name: String,age: Number
});
const User = mongoose.model('User', userSchema);// 插入数据
const user = new User({ name: 'Bob', age: 25 });
user.save().then(() => console.log('User saved'));// 查询数据
User.findOne({ name: 'Bob' }).then(user => console.log('User found:', user));
适用场景:
  • 需要灵活的数据结构
  • 文档型数据存储(JSON-like)
  • 高可扩展性和性能需求

4. 使用 Redis 缓存

Redis 是一个基于内存的高性能键值数据库,适合用作缓存系统,支持丰富的数据结构,如字符串、列表、集合等。

安装 redis
npm install redis
连接和操作 Redis
const redis = require('redis');
const client = redis.createClient();// 连接到 Redis
client.on('connect', () => {console.log('Connected to Redis');
});// 设置键值对
client.set('key', 'value', (err, reply) => {console.log(reply);  // OK
});// 获取值
client.get('key', (err, reply) => {console.log(reply);  // value
});// 关闭连接
client.quit();
适用场景:
  • 缓存系统(存储频繁访问的数据,减轻数据库负担)
  • 会话管理(如用户登录状态)
  • 分布式锁、队列等高级应用

5. 使用 Elasticsearch 检索服务

Elasticsearch 是一个分布式搜索引擎,适合用于复杂的搜索和分析场景,尤其是处理大量文本数据的情况下。

安装 @elastic/elasticsearch
npm install @elastic/elasticsearch
使用 Elasticsearch 进行搜索
const { Client } = require('@elastic/elasticsearch');
const client = new Client({ node: 'http://localhost:9200' });async function run() {// 索引文档await client.index({index: 'users',document: {name: 'Alice',age: 30}});// 刷新索引await client.indices.refresh({ index: 'users' });// 搜索文档const { body } = await client.search({index: 'users',query: {match: { name: 'Alice' }}});console.log(body.hits.hits);
}run().catch(console.log);
适用场景:
  • 全文搜索,文本数据分析
  • 需要复杂的查询、聚合和统计分析
  • 日志和事件数据分析
特性MySQLMongoDBPostgreSQLRedisElasticsearch
类型关系型数据库 (RDBMS)NoSQL 文档型数据库关系型数据库 (RDBMS)键值对存储 (NoSQL)分布式搜索和分析引擎
数据结构表 (Rows and Columns)JSON-like 文档表 (Rows and Columns)键值对、列表、集合等数据结构文档索引,类似 JSON 结构
查询语言SQLMongoDB Query Language (MQL)SQL无查询语言,基于键的操作Elasticsearch Query DSL
事务支持完整的事务支持支持多文档 ACID 事务 (4.0+)完整的事务支持不支持事务不支持事务
扩展性垂直扩展为主,支持集群部署水平扩展 (Sharding)垂直扩展为主,支持分片支持水平扩展,主从复制水平扩展 (Sharding)
性能高性能,适合复杂查询高吞吐量,适合大规模数据适合复杂查询,支持 JSON极快,适合缓存、实时处理高速全文搜索,适合大规模文本数据
一致性强一致性默认最终一致性,可配置强一致性强一致性最终一致性最终一致性
适用场景结构化数据、高并发、复杂事务处理灵活的数据结构、大数据处理复杂事务、支持多种数据类型缓存、会话管理、排行榜、消息队列全文搜索、日志分析、复杂查询
优势成熟稳健,支持复杂的联表查询灵活、易于扩展,支持海量数据开源、标准化、支持高级功能高性能,低延迟,丰富的数据结构高性能文本搜索,实时分析
缺点扩展性有限,水平扩展复杂缺乏复杂联表查询和事务学习曲线稍陡峭,配置复杂数据持久性弱,主要用于缓存配置和使用较为复杂
常见应用电商网站、银行系统、ERP内容管理系统、数据收集平台金融系统、企业级应用实时缓存、排名、会话管理日志分析、搜索、实时数据监控

总结

  • 文件系统:适合处理本地文件的读写操作。
  • MySQL:适合处理结构化数据,有事务需求的场景。
  • MongoDB:适合灵活的数据模型和大规模数据存储。
  • Redis:适合缓存、会话存储、分布式系统。
  • Elasticsearch:适合大规模文本检索和复杂数据查询。

根据具体的业务需求,可以选择合适的技术栈来存储、处理和检索数据。


http://www.ppmy.cn/embedded/129658.html

相关文章

构建后端为etcd的CoreDNS的容器集群(六)、编写自动维护域名记录的代码脚本

本文为系列测试文章,拟基于自签名证书认证的etcd容器来构建coredns域名解析系统。 一、前置文章 构建后端为etcd的CoreDNS的容器集群(一)、生成自签名证书 构建后端为etcd的CoreDNS的容器集群(二)、下载最新的etcd容…

[申请] 准备 2024.10.20

📝 准备工作细节 具体的申请准备内容: 推荐信:选择合适的推荐人至关重要!教授与你的关系、学术匹配度、他/她的影响力都是需要考虑的因素。要问自己几个问题,比如: 哪位教授对我的工作印象深刻&#xff1…

ubuntu 安装haproxy

####安装##### sudo apt update sudo apt install haproxy sudo haproxy -v sudo systemctl status haproxy sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg-org####配置站点##### nano /etc/haproxy/haproxy.cfgfrontend www-httpbind *:5001mode httpdefault_ba…

LeetCode 3184.构成整天的下标对数目 I:暴力模拟(下一题再用哈希表)

【LetMeFly】3184.构成整天的下标对数目 I:暴力模拟(下一题再用哈希表) 力扣题目链接:https://leetcode.cn/problems/count-pairs-that-form-a-complete-day-i/ 给你一个整数数组 hours,表示以 小时 为单位的时间&am…

风口浪尖上的新乡医学院第一附属医院

近期,河南豫北规模最大的公立三甲医院——新乡医学院第一附属医院,隆重开展了医院医疗设备维保托管项目服务。此项目总金额高达 5400 万,堪称河南省有史以来最大的一次医疗设备维保项目,一时间在行业内引发广泛关注。 回溯今年 5 月份,曾有新闻在坊间流传,称河南爱生医疗器械有…

计算机组成原理一句话

文章目录 计算机系统概述存储系统 计算机系统概述 指令和数据以同等地位存储在存储器中,形式上没有差别,但计算机应能区分他们。通过指令周期的不同阶段。 完整的计算机系统包括,1)软件系统:程序、文档和数据&#xff…

nosql课本习题

nosql题目 1. 文档数据库相比其他 NoSQL 的突出优势和特点是什么? 答案: 文档数据库的突出优势在于它的灵活性和可扩展性。不同于传统的关系型数据库,文档数据库允许存储半结构化和非结构化数据,每个文档可以有不同的字段&#x…

MyBatis 配置详解

在项目中经常会用到 mybatis 相关的一些配置,而在启动类项目工程中,一般会把 mybatis 配置文件单独写到 mybatis,yml 中,如下简单介绍下常用的 mybatis 配置 mybatis:configuration:call-setters-on-nulls: truemap-underscore-to-camel-case…