Nodejs从入门到高阶-大虫小呓三部曲(进阶篇)

[CTFSHOW][WEB入门]nodejs部分WP 文章目录前言web334web335web336方法一方法二方法三web337 前言 nodejs从入门到挖坟,今天早上刚刚学了一点,成功了,比较开心 web334 下载源码下来在user.js里面发现了用户名和密码,群主比较坑哈,搞了个大写,明明是小写,ctfshow与密码我忘了压缩包懒得下 web335 一道Node.JS的RCE 之后cat fl00g.txt即可 web336 方法一 先用上一题paylaod 尝试绕过姿势,也不行 那么试一下读取下文件呢,看看过滤了啥,通过全局变量读取当前目 阅读详情


欢迎来到 Node.js 进阶教程!在本教程中,你将学习到更多 Node.js 的高级特性,包括异步编程、事件循环、流处理、数据库连接等。

本教程共三篇分别是:入门篇、进阶篇、高阶篇。适用于有一定web前端基础,想通过学习nodejs发展为全栈工程师的人群。

目录

  1. 异步编程与 Promise
  2. async/await 语法
  3. 事件循环
  4. 流处理
  5. 连接数据库(包含 Mysql、MongoDB以及 Redis)
  6. 构建 RESTful API
  7. 总结

异步编程与 Promise

Node.js 是单线程的,但它通过异步编程模型实现了高并发。Promise 是处理异步操作的一种方式。

创建 async_example.js:

// 模拟异步操作
function fetchData(name) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (name === '大虫小呓') {
        resolve({ name, data: '这是来自服务器的数据' });
      } else {
        reject(new Error('用户不存在'));
      }
    }, 1000);
  });
}

// 使用 Promise
fetchData('大虫小呓')
  .then(result => {
    console.log(result);
  })
  .catch(error => {
    console.error(error.message);
  });

运行示例:

node async_example.js

async/await 语法

async/await 是 ES2017 引入的特性,它让异步代码看起来像同步代码,更容易理解和维护。

创建 async_await_example.js:

// 模拟异步操作
function fetchData(name) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (name === '大虫小呓') {
        resolve({ name, data: '这是来自服务器的数据' });
      } else {
        reject(new Error('用户不存在'));
      }
    }, 1000);
  });
}

// 使用 async/await
async function getData() {
  try {
    const result = await fetchData('大虫小呓');
    console.log(result);
  } catch (error) {
    console.error(error.message);
  }
}

getData();

运行示例:

node async_await_example.js

事件循环

Node.js 的事件循环是其高性能的核心。理解事件循环有助于编写更高效的代码。

创建 event_loop_example.js:

console.log('1. 开始执行');

setTimeout(() => {
  console.log('2. setTimeout 回调');
}, 0);

setImmediate(() => {
  console.log('3. setImmediate 回调');
});

process.nextTick(() => {
  console.log('4. process.nextTick 回调');
});

console.log('5. 执行结束');

运行示例:

node event_loop_example.js

观察输出顺序,理解事件循环的不同阶段。

流处理

Node.js 的流(Stream)是一种处理数据流的强大工具,特别适用于大文件处理。

创建 stream_example.js:

const fs = require('fs');
const { Transform } = require('stream');

// 创建一个转换流,将文本转换为大写
class UpperCaseTransform extends Transform {
  _transform(chunk, encoding, callback) {
    this.push(chunk.toString().toUpperCase());
    callback();
  }
}

// 创建读取流和写入流
const readStream = fs.createReadStream('example.txt');
const writeStream = fs.createWriteStream('uppercase_example.txt');
const upperCaseTransform = new UpperCaseTransform();

// 管道连接流
readStream
  .pipe(upperCaseTransform)
  .pipe(writeStream)
  .on('finish', () => {
    console.log('文件转换完成!');
  });

首先创建一个 example.txt 文件:

echo "Hello, 大虫小呓! This is a test file for streams." > example.txt

然后运行流处理示例:

node stream_example.js

查看生成的 uppercase_example.txt 文件内容。

连接数据库

在实际项目中,我们经常需要连接数据库。这里以 MongoDB、MySQL 和 Redis 为例,展示如何在 Node.js 中连接不同的数据库。

MongoDB 示例

首先安装 MongoDB 驱动:

npm install mongodb

创建 db_example.js:

const { MongoClient } = require('mongodb');

async function connectToDatabase() {
  const uri = 'mongodb://localhost:27017';
  const client = new MongoClient(uri);

  try {
    // 连接到 MongoDB
    await client.connect();
    console.log('成功连接到 MongoDB');

    // 选择数据库和集合
    const database = client.db('testdb');
    const collection = database.collection('users');

    // 插入文档
    const user = { name: '大虫小呓', email: 'dachongxiaoyi@example.com' };
    const result = await collection.insertOne(user);
    console.log('插入的文档 ID:', result.insertedId);

    // 查询文档
    const query = { name: '大虫小呓' };
    const userFound = await collection.findOne(query);
    console.log('找到的用户:', userFound);
  } finally {
    // 确保关闭连接
    await client.close();
    console.log('断开数据库连接');
  }
}

connectToDatabase().catch(console.error);

注意:要运行这个示例,你需要先安装并启动 MongoDB 服务器。

MySQL 示例

首先安装 MySQL 驱动:

npm install mysql2

创建 mysql_example.js:

const mysql = require('mysql2/promise');

async function connectToMySQL() {
  // 创建连接配置
  const config = {
    host: 'localhost',
    user: 'root',
    password: 'your_password', // 请替换为你的 MySQL 密码
    database: 'testdb'
  };

  let connection;
  
  try {
    // 建立连接
    connection = await mysql.createConnection(config);
    console.log('成功连接到 MySQL');

    // 创建表(如果不存在)
    await connection.execute(`
      CREATE TABLE IF NOT EXISTS users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(255) NOT NULL,
        email VARCHAR(255) NOT NULL
      )
    `);
    
    // 插入数据
    const [insertResult] = await connection.execute(
      'INSERT INTO users (name, email) VALUES (?, ?)',
      ['大虫小呓', 'dachongxiaoyi@example.com']
    );
    console.log('插入的记录 ID:', insertResult.insertId);

    // 查询数据
    const [rows] = await connection.execute('SELECT * FROM users WHERE name = ?', ['大虫小呓']);
    console.log('找到的用户:', rows[0]);
  } catch (error) {
    console.error('MySQL 连接错误:', error);
  } finally {
    // 关闭连接
    if (connection) {
      await connection.end();
      console.log('断开 MySQL 数据库连接');
    }
  }
}

connectToMySQL();

注意:要运行这个示例,你需要先安装并启动 MySQL 服务器,并将代码中的 your_password 替换为你的实际密码。

Redis 示例

首先安装 Redis 驱动:

npm install redis

创建 redis_example.js:

const redis = require('redis');

async function connectToRedis() {
  // 创建 Redis 客户端
  const client = redis.createClient({
    host: 'localhost',
    port: 6379
  });

  try {
    // 连接到 Redis
    await client.connect();
    console.log('成功连接到 Redis');

    // 设置键值对
    await client.set('user:name', '大虫小呓');
    await client.set('user:email', 'dachongxiaoyi@example.com');
    
    // 获取值
    const name = await client.get('user:name');
    const email = await client.get('user:email');
    console.log('用户名:', name);
    console.log('邮箱:', email);
    
    // 使用哈希存储用户信息
    await client.hSet('user:1', {
      name: '大虫小呓',
      email: 'dachongxiaoyi@example.com'
    });
    
    // 获取哈希值
    const user = await client.hGetAll('user:1');
    console.log('用户信息:', user);
  } catch (error) {
    console.error('Redis 连接错误:', error);
  } finally {
    // 关闭连接
    await client.quit();
    console.log('断开 Redis 连接');
  }
}

connectToRedis();

注意:要运行这个示例,你需要先安装并启动 Redis 服务器。

构建 RESTful API

使用 Express.js 框架可以快速构建 RESTful API。

首先安装 Express:

npm install express

创建 api_example.js:

const express = require('express');
const app = express();
const port = 3000;

// 中间件,用于解析 JSON 请求体
app.use(express.json());

// 模拟数据存储
let users = [
  { id: 1, name: '大虫小呓', email: 'dachongxiaoyi@example.com' },
  { id: 2, name: '张三', email: 'zhangsan@example.com' }
];

// 获取所有用户
app.get('/users', (req, res) => {
  res.json(users);
});

// 根据 ID 获取用户
app.get('/users/:id', (req, res) => {
  const userId = parseInt(req.params.id);
  const user = users.find(u => u.id === userId);
  
  if (!user) {
    return res.status(404).json({ message: '用户未找到' });
  }
  
  res.json(user);
});

// 创建新用户
app.post('/users', (req, res) => {
  const newUser = {
    id: users.length + 1,
    name: req.body.name,
    email: req.body.email
  };
  
  users.push(newUser);
  res.status(201).json(newUser);
});

// 启动服务器
app.listen(port, () => {
  console.log(`服务器运行在 http://localhost:${port}`);
});

运行 API 服务器:

node api_example.js

你可以使用 curl 或 Postman 测试这些 API 端点:

# 获取所有用户
curl http://localhost:3000/users

# 获取特定用户
curl http://localhost:3000/users/1

# 创建新用户
curl -X POST -H "Content-Type: application/json" -d '{"name":"李四","email":"lisi@example.com"}' http://localhost:3000/users

总结

通过本教程,你学习了 Node.js 的异步编程、事件循环、流处理、数据库连接(包含Mysql、MongoDB以 及 Redis)和 RESTful API 构建等高级特性。这些知识将帮助你构建更复杂和强大的 Node.js 应用。接下来可以学习高阶教程,深入了解 Node.js 的性能优化和微服务架构。

39-Halcon-- fit_primitives_object_model_3d函数功能(从3D数据中提取几何基元) Halcon算子fit_primitives_object_model_3d工业应用精要 该算子专为3D几何特征提取设计,支持平面、球体、圆柱等基元拟合。核心优势: 参数化输出:返回几何元素的数学参数(如平面方程、球心半径) 智能控制:通过max_dist、min_size等参数调节拟合精度 工业场景适配:针对薄壁件、孔系等提供专用优化方案 典型应用流程: 数据预处理(点云降噪/采样) 基元类型与参数设置 多阶段拟合(先平面后圆柱) 几何精度验证 误差控制在0.1%-1.2%范围内(视点云密度而定),适用于 阅读详情

相关推荐

人形机器人触觉革命:压电式电子皮肤的多模态感知与自修复技术突破

本文深入探讨了压电式电子皮肤如何推动人形机器人的触觉革命。文章分析了其基于压电效应的多模态感知原理,能够灵敏检测压力、振动与温度,并重点介绍了赋予电子皮肤自修复能力的动态共价网络等前沿材料技术,从而极大提升了机器人与物理世界进行精细、安全交互的可靠性与智能化水平。

weixin_29251567的博客 194

「NodeJs进阶」超全面的 Node.js 性能优化相关知识梳理

相信对于前端同学而言,我们去开发一个自己的简单后端程序可以借助很多的nodeJs的框架去进行快速搭建,但是从前端面向后端之后,我们会在很多方面会稍显的有些陌生,比如「性能分析」,「性能测试」,「内存管理」,「内存查看」,「使用C++插件」,「子进程」,「多线程」,「Cluster模块」,「进程守护管理」等等NodeJs后端的知识,在这里为大家来分析一下这些场景与具体实现。 搭建基础服务 首先我们先来实现一个简单的Http服务器,为了演示方便这里我们使用express,代码如下: const fs = req

主要分享测试的学习资源,帮助快速了解测试行业,帮助想转行、进阶、小白成长为高级测试工程师。 2735

igh ethercat 实时性测试

组备注std(us)max(us)a无锁核,无rt补丁8.38108b锁核+FIFO调度+内存锁定,无rt补丁0.9216c锁核+FIFO调度+内存锁定,+rt补丁0.9922可以看到 a组 使用ethercat不做其他优化,周期抖动非常大,且max能达到 100 多 us;通过 锁核+FIFO调度+内存锁定 进行优化,可以看到 抖动明显降低,且max 为 20 us 左右;

qq_43353632的博客 2309

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(二)NodeJS入门——buffer模块、计算机基础、fs模块、path模块

2023Node.js零基础教程(小白友好型),nodejs新手到高手,(二)NodeJS入门——buffer模块、计算机基础、fs模块、path模块

upgrade_bro的博客 2328

ECC密码的加密和解密(附带代码实现)

ECC,全称Elliptic Curve Cryptography,是椭圆曲线密码学。这是一种公钥加密技术,其安全性基于椭圆曲线离散对数问题,被广泛应用于信息安全领域。ECC的主要优势在于,相较于RSA和DSA等其他传统的公钥密码体系,它能够在提供相同安全级别的情况下,使用更短的密钥,从而减少计算量和存储空间的需求。例如,一个256位的ECC密钥提供的安全性可以与3072位的RSA密钥或DSA密钥相媲美。ECC的主要应用领域包括SSL安全证书、安全电子邮件、移动设备安全、物联网设备安全等。

xixixi7777的博客 8268

05GATK流程和找变异

05GATK流程和找变异 GATK 集合了一套功能全面的高通量测序数据基因组分析工具包,算是业界的权威,更新的速度非常快。需要注意的是,不同版本的 GATK 在工具应用上会有些许不同。这里我们使用是最新版本 GATK 4.1.4.1(截止2019年12月31日)。 数据准备 前面我们提到了,走GATK流程需要到官网下载很多数据库文件,比如下面这些: dbsnp_146.hg38.vcf.gz dbsnp_146.hg38.vcf.gz.tbi Mills_and_1000G_gold_standard.

qq_23435961的博客 1659

nodejs进阶

npm是Node Package Manager(Node.js包管理器)的缩写,是Node.js社区最流行的包管理工具之一。它不仅提供了包管理的功能,还提供了发布和共享代码、管理依赖、版本控制等功能,可以帮助开发者更方便地开发和分享代码。npm可以用来从全球的代码库中获取并安装Node.js模块,这些模块可以用于构建应用程序、工具和包等。开发者可以通过npm来搜索、安装、更新和卸载各种Node.js模块。

weixin_43599321的博客 2011

X86/64架构中的总线 和 ARM架构中总线的理解

内部总线 /CPU总线/FSB前端总线:类似ARM架构中的AHB总线北桥? 直接和CPU连接,这条总线主要由CPU使用,用来与高速缓存、主存和北桥(或MCH)之间传送信息。 外部总线:类似ARM架构中的APB总线(外围总线)南桥?例如PCI总线、USB总线等 通过北桥与CPU连接(南桥?),是CPU与内存RAM、ROM和输入/输出设备接口之间进行通讯的通路 内存总线:内存与北桥间的总线称为内存总线 ...

a746742897的博客 1065

2023Node.js零基础教程(小白友好型),nodejs新手到高手,(一)NodeJS入门

2023版Node.js零基础教程(小白友好型),nodejs新手到高手;为什么要学习NodeJS?——开发服务器应用;NodeJS入门——安装、命令行工具、常用命令以及初体验……

upgrade_bro的博客 2430

ZYNQ GP总线实现PS与PL交互

3,完成 ZYNQ7 Processing System 的配置更改后,回到 Diagram 界面中,可以看到新出现了名为 M_AXI_GP0_ACLK、M_AXI_GP0 和 FCLK_CLK0 的接口,下面我们要对这些接口进行连接或引出。此处的偏移量,AXI的相邻寄存器偏移量相差4个字节,默认slv_reg0的偏移量是0,可以推导出slv_reg1,slv_reg2的偏移量分别为4和8,这里只用到了slv_reg0,所以偏移量为0。当然了,窗口数量的增加,势必会使得单个窗口的采样深度变小。

wangjie36的博客 7093

天龙八部TLBB系列 - 网单用数据库修改为其他门派

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等) --- 天龙八部修改门派

空名先生 9429

NodeJS基础及进阶(一)

本文主要介绍NodeJS基础知识部分,主要包括Node的安装和配置、fs、path和http内置模块以及实操demo—时钟案例。可以说,学完此文,朋友们就算是入门Node了。还等什么,接着往下看吧!

qq_44581775的博客 2013

《人工智能基础》[工具篇2]:ChatBox怎么使用本地模型和知识库配置教程

通过设置-知识库,添加,填入知识库名称、选用的嵌入模型创建好知识库后,点击添加文件按钮+,可以上传本地文件、拖动文件支持上传PDF、DOCX等格式的文档。系统会自动对文档进行处理。批量上传:一次最多上传 50 个文档,总大小不超过 2GB;格式检测:支持 PDF/DOCX/TXT/Markdown,不支持 EXE/RAR 等二进制文件。‌文档类‌图片类‌代码类‌:Python、Java、JavaScript等编程文件‌其他‌:Markdown(用于导出对话记录) ‌。

专注大数据、云计算、人工智能、机器人领域技术传播 2934

Nodejs从入门到高阶-大虫小呓三部曲(高阶篇)

欢迎来到 Node.js 高阶教程!在本教程中,你将学习到 Node.js 的性能优化、微服务架构、测试策略和部署等方面的知识。

bigbigbugbug的博客 462

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Nodejs从入门到高阶-大虫小呓三部曲(入门篇)

本教程共三篇分别是:入门篇、进阶篇、高阶篇。适用于有一定前端基础,想通过学习nodejs发展为全栈工程师的人群。

bigbigbugbug的博客 371

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

NodeJS入门(一)---nodejs详细安装步骤

参考文章:http://www.lvtao.net/content/book/node.js.htm#1.5

u010255310的博客 12万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Nodejs安装及配置

Nodejs的安装及配置详细教程 本文更新于2020-12-2,如果时间太久已失效,请留言 本教程使用虚拟机全新环境进行演示,如未安装过Nodejs几乎100%安装配置成功,如未成功,请洗脸重试~ 下载Nodejs 进入Nodejs官网https://nodejs.org/zh-cn/ 选择下载最新版,也可以选择稳定的版本,个人喜欢用新的 安装Nodejs 双击下载的安装包 点击Next,开始进入安装 勾选 I accept the terms in the License

3万+

NodeJS入门文档推荐

我觉得下面文章讲的非常不错,适合nodejs入门学习。七天学会NodeJS

taoerchun的专栏 2726

NodeJS 安装 NodeJS 入门 NodeJS Hello World

NodeJS 安装 NodeJS 入门 NodeJS Hello World 一、下载安装 1、https://nodejs.org/en/download/ 2、以Windows为例,下载64位v12.8.0版本 3、双击 node-v12.8.0-x64 .msi ,进行安装操作 ,下一步,下一步即可。 二、Hello World 1、WIN+R --- cmd --- 输入 node -v , 即可确认是否安装完成...

HaHa_Sir的博客 525

java教程-NodeJS快速入门

NodeJS简介 了解NodeJS 简单的说 Node.js 就是运行在服务端的 JavaScript。Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。 Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。 NodeJS安装 下载对应你系统的Node.js版本:https://nodejs.org/en/download/;http://yun.itheima.co

无发可说的博客 596

【2】安装Nodejs-Nodejs开发入门

本文详细介绍了如何在Windows系统中安装Nodejs,同时也介绍了一个新的node管理工具fnm用于替代nvm,最后介绍了几款npm的替代品,它们都可以用来管理包。

一个半吊子讲师的博客。 2229

NodeJS入门--环境搭建 IntelliJ IDEA

NodeJS入门–环境搭建 IntelliJ IDEA本人也刚开始学习NodeJS,所以以此做个笔记,欢迎大家提出意见。1、首先 载安装IntelliJ IDEA 2、接下来我们详细介绍在IDEA中配置NodeJS 默认安装好了IDEA,在IDEA的file -> setting ->Plugins,右边默认是没有这个组件的需要你手动点击Browe repositories..,在插件列表中搜索no

倔强的傻小子 7万+

NodeJS快速入门,适合小白学习的经典教程

1.NodeJS简介 1.1 了解NodeJS 简单的说 Node.js 就是运行在服务端的 JavaScript。Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。 Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。 1.2 NodeJS安装 下载对应你系统的Node.js版本:https://nodejs.org/en/download/ (我们现在使用的

CZ-001的博客 1605

NodeJS(一):基础入门

有参看其他文章 尚硅谷视频笔记:https://github.com/smallC-L-Y/Demo/blob/notes/nodeJS%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.md https://www.cnblogs.com/coder-lzh/p/9232192.html commonJS模块规范:https://javascript.ruanyifeng.com/nodejs/module.html nodejs的express入门:https://www.jia

算云烟 1999

NodeJS入门

NodeJS入门前言一、nodejs简介什么是nodejs?nodejs能做什么?二、使用步骤1.引入库2.读入数据总结 前言 初学NodeJS,就是要弄清楚什么是nodejs,能做什么,怎么用。 一、nodejs简介 什么是nodejs? 简单来说,nodejs是一个脚本语言解析器。 脚本语言需要一个解析器才能运行,JavaScript是脚本语言,在不同的位置有不一样的解析器,如写入html的js语言,浏览器是它的解析器。而对于需要独立运行的JS,nodejs就是一个解析器。 每一种解析器都是一个运行

雪花红梅的博客 398

nodeJS入门

什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行。对于写在HTML页面里的JS,浏览器充当了解析器的角色。而对于需要独立运行的JS,NodeJS就是一个解析器。 每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情。例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了document之类的...

黄河边上的牧马人 295
上一篇: Nodejs从入门到高阶-大虫小呓三部曲(入门篇)
下一篇: Nodejs从入门到高阶-大虫小呓三部曲(高阶篇)
大虫小呓
博客等级 码龄7年 94粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值