nodejs(1)

md文件笔记的编写

node

what

  • chrome VB runtime
  • 事件驱动
  • 非阻塞的 i/o

i/o:input output 输入输出流 正常下i/o的操作都是阻塞的(ajax同步)
网络请求 数据库处理 文件的读写。。。。
优点:高并发特别好

why

  1. 防止甩锅,明确数据交互的错误问题在谁
  2. 能够书写api,斜杠青年
  3. 了解前后端的交互流程
  4. 全栈工程师

js运行环境

  • 浏览器
    • 基本语法
    • bom
    • dom
    • ajax
    • 系统文件数据库(不能,不是语言不能 处于安全性考虑不能)
  • 服务器
    • 基本语法
    • 能操作数据库
    • 能操作本地文件

限制语言能力的不是语言本身,而是语言的运行环境(平台)

nvm(node的切换版本工具)

node运行环境 REPL

直接在命令行写代码 命令行内输入node
写在文档之中,敲击 node+文件路径名 运行

模块化

  • 内置模块(node中提供的可以直接调用)
    • 文件操作
  • 第三方模块
  • 自定义模块
    • 创建一个模块(一个js文件就是一个模块)
    • 导出一个模块(module.exports=name)
    • 引用一个模块并且调用(require)

创建及导出一个模块

let name = {
    sayHello(){
        console.log("你好韩梅梅");
    }
}

modules.exports = name;

引用一个模块并调用

let Module = require("./module");
console.log(Module);
Module.sayHello();
打印当前目录的目录树
  1. 实现的效果
  2. 分析功能点
    • 当前目录结构
    • 分辨是文件还是文件夹

内置模块 fs

readdir.js

const fs=require("fs")
// 同步读取文件 在关键位置捕获错误信息
/* let dirs=fs.readdirSync("./")
console.log(dirs); */
// try{
//     //可能出错的代码
//     let dirs=fs.readdirSync("./node02")
// }catch(err){
//     console.log("出错了")
//     console.log(err)
// }
// console.log(2222)

// 异步读取
fs.readdir("./",(err,data)=>{
    /* console.log(err)
    console.log(data) */
    if(err){  //err 为真有错误  默认 是 null
        console.log("读取错误")
    }else{
        console.log(data)
    }
})
console.log(222)

// 错误的回调优先,在回调函数中第一个参数表示错误对象,默认为null 如果出现错误err 就是错误对象
/*  错误处理 同步:try catch  异步:错误回调优先
 文件夹的错误
 curd(create update read delete) */

mkdir.js

const fs=require('fs')
fs.mkdir('./test',(err,data)=>{
    console.log(err)
    console.log(data)
})

// 更改
fs.rename('./test','./test01',(err)=>{
    if(err){
        console.log("更改失败")
    }else{
        console.log("ok")
    }
})

// 删除 只能删除空文件夹
fs.rmdir('./test',(err)=>{
    if(err){
        console.log('更改失败')
        console.log(err)
    }else{
        console.log("ok")
    }
})

dirtree.js

const fs=require('fs')
// fs.readdir('../nodejs',(err,dirs)=>{
//     for(let index=0;index<dirs.length;index++){
//         console.log(dirs[index])
//     }
// })

fs.stat('../nodejs',(err,stats)=>{
    if(stats.isFile()){
        console.log("is file")
    }else{
        console.log("is dir")
    }
})

内置模块 url

url 统一资源定位符
https:47.95.207.1:3000/fcj/recommend/hto/hehe?us=123&ps=567#nihao

querystring.js

const qs = require('querystring')
// let string='name=wangmin&pass=123&sex=0'
// let obj=qs.parse(string) //将query 字符串编程query对象  split
// let obj=qs.parse(string,'&','=')
// console.log(obj) //{ name: 'wangmin', pass: '123', sex: '0' }

//stringfy
let obj={ name: 'wangmin', pass: '123', sex: '0' }
// let string=qs.stringify(obj)
// let string=qs.stringify(obj,'^','?')
// console.log(string) //name=wangmin&pass=123&sex=0

//编码
// let stringfg='w=你好&foo=bar'
// let result=qs.escape(stringfg)
// console.log(result)

// 解码
let escape='w%3D%E4%BD%A0%E5%A5%BD%26foo%3Dbar'
console.log(qs.unescape(escape))

url.js

consturl=require('url')
let urlString ='https:47.95.207.1:3000/fcj/recommend/hto/hehe?us=123&ps=567#nihao'
let urlObj=url.parse(urlString)
console.log(urlObj)

// url.format() 字符串转为对象
// url 类比json 记忆
// url.parse 将url字符串转成对象
// url.format将url 对象转字符串

爬虫案例

  1. 获取目标网站 http.get
  2. 分析网站内容 cheerio 可以使用jq里的选择器
    npm install cheerio --save
  3. 获取有效信息 下载或者其他操作 下载或者其他操作
    splider.js
/* 
1.请求网站数据
2.将数据保存本地文件
*/
const http=require('https')
const fs=require('fs')
const cheerio = require('cheerio')
let url='https://www.qunar.com/'
let json='http://nodejs.org/dist/index.json'
http.get(url,(res)=>{
    // 安全判断
    const { statusCode } = res //状态码
    const contentType = res.headers['content-type'] //文件类型
    
    console.log(statusCode,contentType)

    let err=null;
    if(statusCode!==200){
        err=new Error('请求状态错误')
    }else if(!/^text\/html/.test(contentType)){
        // 格式类型是网页
        err = new Error('请求类型错误')
    }

    if(err){
        console.log(err)
        res.resume(); //重置缓存
        return false
    }

    // 数据处理
    // 数据分段 只要接受数据就会触发data 事件 chunk 每次接受的数据片段
    let rawData=''
    res.on('data',(chunk)=>{
        console.log("------")
        rawData+=chunk.toString('utf8')
        // console.log(chunk.toString('utf8'))
    })
    // 数据流传输完毕
    res.on('end',()=>{
        // 将请求的数据保存到本地
        // fs.writeFileSync('./bibi.html',rawData)
        console.log("数据传输完毕")
        // 通过cheerio分析
        let $=cheerio.load(rawData) //将请求的网页数据进行转化
        $('img').each((index,el)=>{
            console.log($(el).attr('src'))
        })
    })
}).on('error',(err)=>{
    console.log("请求错误")
})

cheerio.js

const cheerio = require('cheerio')
let $ = cheerio.load('<div><p>你好</p><img src="http://www.baidu.com"><img src="http://www.baidu111.com"></div>')
// 将一组 html 格式的字符串转化成类dom 之后可以通过jq的语法选中其中的元素
// console.log($('img').attr('src'))
// console.log($('p').text())
$('img').each((index,el)=>{
    console.log($(el).attr('src'))
})

第三方模块-nodemailer

邮箱验证码案例

注册案例 15600000000 pass pass

  • nodemailer 可以实现发邮件
  • npm install jquery --save
  • npm官网

npm init --yes
npm install nodemailer

mail.js

"use strict";
const nodemailer = require("nodemailer");

  // 创建发送邮件的对象
  let transporter = nodemailer.createTransport({
    host: "smtp.qq.com", //发送方邮箱 qq 通过lib/well-know/service.json
    port: 465, //端口号
    secure: true, // true for 465, false for other ports
    auth: {
      user: '473334763@qq.com', // 发送方邮箱地址
      pass: 'sqfumltyddoubgjj', // mtp 验证码
    },
  });

  // 邮件信息
  let mailobj={
    from: '"Fred Foo 👻" <473334763@qq.com>', // sender address
    to: "473334763@qq.com", // list of receivers
    subject: "1902", // Subject line
    text: "您的验证码是12345678,有效期五分钟", // plain text body
    // html: "<b>Hello world?</b>", // html body
  }

//   发送邮件
 transporter.sendMail(mailobj,(err,data)=>{
     console.log(err)
     console.log(data)
 });

//  每隔1s发一次
/*  setInterval((err,data) => {
    transporter.sendMail(mailobj);
 }, 1000); */

网络基本知识

+ web服务器
+ api服务器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值