nodejs学习重点二

本文介绍了Node.js中的crypto模块,包括哈希算法(如MD5、SHA1、SHA256、Hmac)和对称加密算法AES。接着讨论了事件驱动模型在Node.js中的应用,以及一个使用事件驱动重构的美女图片爬虫项目案例。最后,讲解了ORM框架Mongoose,用于简化MongoDB的操作,包括连接数据库、模型定义和增删改查等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. crypto加密

NodeJs的crypto模块提供了哈希,加密相关的功能支持。

哈希算法:MD5,SHA1,SHA256,Hmac

哈希算法用来对数据进行签名,确定数据的唯一性,以及是否被篡改。由于其过程不可逆,也常常用来对用户密码进行加密。如果不放心, 可以给个加盐操作

Hmac是基于key和hash的认证算法。它在上面哈希算法的基础上,再传入一个key。只要key变化,即使输入同样的数据也会得到不同的结果。可以将Hmac理解为随机数增强的哈希算法。

对称加密算法:AES

AES是一种常用的对称加密算法,加解密都用同一个密钥。不安全, 可逆, 不建议对用户使用. node的算法标准是aes192

2. event事件驱动

大多数 Node.js 核心 API 都采用惯用的异步事件驱动架构,其中某些类型的对象(触发器)会周期性地触发命名事件来调用函数对象(监听器)。例如,fs.ReadStream会在文件被打开时触发事件;stream 会在数据可读时触发事件。

用法如下:

  const EventEmitter = require('events')
  class MyEmitter extends EventEmitter{}
  ​
  const myEmitter = new MyEmitter()
  // 注册xxx事件
  myEmitter.on('aaa', (a)=>{
      console.log('aaa事件被触发,参数:'+a);
  })
  // 1秒钟之后触发aaa事件,并传递参数
  setTimeout(()=>{
      myEmitter.emit('aaa', 'aaaaaa')
  },1000)

当你想设计一个模块,它具有在某个条件下执行某个操作的功能,那么event模块就派上用场了。例如:你想设计一个用户注册模块,当用户注册成功之后给用户发送一个email。

它的应用场景就是某种条件达成的时候去执行另外一些操作

3.【案例】美女图片爬虫项目

功能需求:爬取http://www.27270.com/ent/meinvtupian/网站页面,处理GBK乱码的问题;从中提取出图片数据,并下载美女图片。

提示:html的解析需要用到cheerio模块,使用iconv-lite模块处理gbk编码问题,iconv-lite Github

前置知识点学习:

  • 学习使用cheerio模块进行数据的提取。cheerio官方文档

    参考官网的api,分别练习从一段给定的dom中,提取标签的text,属性值,以及如何取多个标签的text。

实现爬虫功能,需要实现抓取页面,提取数据,下载图片,这些子功能。而这些功能的调用都是当某个步骤完成了,就执行下一个步骤,有顺序的。

所以,使用event模块来重构整个项目的架构

有多个标签就用to.Array来取出所有的DOM元素

//用cheerio类库取属性  提取图片的内容
let cheerio = require('cheerio');

let html =`<div>
    <h2>我是一个标题</h2>
    <ul>
        <li><a href="http://www.baidu.com">百度</a></li>
        <li><a href="http://www.sina.com">新浪</a></li>
        <li><a href="http://www.google.com">谷歌</a></li>
        <li><a href="http://www.itcast.cn">传智</a></li>
    </ul>
</div>`


let $ = cheerio.load(html);
//取出h2标签  取出里面的文本
console.log($('h2').text());

// 取到ul下面的li 在取到下面的a  $选择器 转化为数组
let arr = $('ul>li>a').toArray();
for (let i = 0; i < arr.length; i++){
    let obj =arr[i];
    console.log($(obj).text());
    console.log($(obj).attr("href"));
}
console.log();

4. mongoose

ORM - mongoose

无论是mysql还是mongodb,传统的与数据库交互的方式都是按照他们提供的API来写代码。它们提供的API往往不是很容易理解,而且难以记忆,如果传错了参数,写错一个符号都要查文档。就像上面我们学习的数据库API一样。

ORM框架允许我们面向对象操作,不需要记忆任何的数据库API,只需要操作对象即可,由框架底层去调用数据库API,这样就大大提高了程序员的开发效率。不过既然多了一层封装,肯定要损失一点点的性能,可以忽略不计。

在NodeJS中,mongodb最好的orm框架就是mongoose

安装mongoose

  npm install mongoose --save

如果你本机没有安装nodejs驱动,会自动安装nodejs驱动,因为mongoose依赖nodejs驱动了。

文档参考:mongoose官方文档

连接数据库

  const mongoose = require('mongoose')
  //连接数据库
  mongoose.connect("mongodb://127.0.0.1:27017/test");
  const db = mongoose.connection;
  ​
  db.on('error', console.error.bind(console, 'connection error:'));
  db.once('open', function() {  //只会监听一次once
      console.log('连接mongodb成功!');
  });

模型定义

mongoose使用schema来描述数据的格式,字段,规则,有了schema之后可以生成model来操作数据。

  const mongoose = require('mongoose')
  const schema = mongoose.Schema({
      name: {
        type: String,
        required: true
      },
      age: Number,
      fav: [String],
  });
  module.exports = mongoose.model('user', schema)

增删改查

直接查看文档中Model相关API。

  await User.create()
  await User.findOne()
  await User.updateOne()
  await User.deleteOne()
  //增加条件操作符: 所有支持的操作符:https://docs.mongodb.com/manual/reference/operator/query/
  await User.findOne({
      age: {$gt:11},
      tags:{$in:[1,2,3]}
   })

高级查询

  //分页查询   skip表示跳过10个文档   限制查limit个   大小都是自定义的
  await Book.find().skip(10).limit(5)
  ​
  //排序和字段映射    sort就是排序查询  1是从小到大  -1是从大到小
  //select: 查id
  await Book.find().sort("field").select("field1 field2")
  ​
  // 填充查询   gt表示大于多少 根据条件来查询
  let res = await Book.find({price: {$gt: 50}}).populate('author', 'name')
  console.log(res);

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值