Node02

创建http客户端

  • http.get()
  • http.request()
const https = require('https')
let url = 'https://m.you.163.com/xhr/index.json?__timestamp=1600266481664'
https.get(url,(res)=>{
  let resData = ''
  // 请求到的数据分段传输
  // 只要接收到数据就会触发data事件
  res.on('data',(chunk)=>{
    // chunk是每次接收到的数据片段
    console.log('数据传输。。。')
    // console.log(chunk) // 二进制数据流
    // console.log(chunk.toString()) // 字符串
    resData += chunk
  })
  // 数据流传输完毕触发end事件
  res.on('end',()=>{
    console.log('数据流传输完毕')
    console.log(resData)
  })
})

爬虫

  1. 获取目标网站
  • http.get()
  • http.request()
  1. 分析网站内容(解析字符串、正则匹配)
  • cheerio是实现类似jquery核心功能的一个模块
  • cheerio可以将字符串解析成DOM文档,像用jquery操作html一样方便
  • 安装:npm install cheerio
const cheerio = require('cheerio')
// cheerio可以将字符串解析成DOM文档,像用jquery操作html一样方便
let $ = cheerio.load('<div><img src="./a1.jpg"/><img src="./a2.jpg"/></div>')
// 获取多个元素,遍历取值
$('img').each((i, item)=>{
  let src = $(item).attr('src')
  console.log(src)
})
  1. 获取信息(下载或其他操作)

nodemailer模块

const nodemailer = require("nodemailer");
// 创建发送邮件的对象
let transporter = nodemailer.createTransport({
  host: "smtp.ethereal.email",// 发送方邮箱(下方的查找)
  port: 587,// 端口号
  secure: false, // 端口是465为true, 其他端口为false
  auth: {
    user: testAccount.user, // 发送方的邮箱地址,如:99835885@qq.com
    pass: testAccount.pass, // smtp授权码(下方的设置)
  },
});
// 邮件信息对象
let mailOptins = {
  from: '"Fred Foo 👻" <foo@example.com>', // 发送者
  to: "bar@example.com, baz@example.com", // 接收者列表
  subject: "Hello ✔", // 邮件主题
  text: "Hello world?", // plain text body
  html: "<b>Hello world?</b>", // html body
};
// 发送邮件
transporter.sendMail(mailOptins,(err)=>{
  if (err) {
    console.log('发送失败')
    console.log(err)
  }
});
  • 查找 node_modules/nodemailer/lib/well-know/services.json
  • 选择对应的邮箱,如:
"QQ": {
  "domains": ["qq.com"],
  "host": "smtp.qq.com",
  "port": 465,
  "secure": true
}
  • smtp验证码设置

    1. 登录QQ邮箱首页
    2. 点击左上方的 设置 -> 账户 -> 开启服务 -> 开启POP3/SMTP服务
    3. 验证账号身份后获得授权码:lvtyztvhegfzbiff
  • 发送 text 或 html 只能二选一

  • 封装一个发邮件的模块

let mail = require('./mail.js')
mail.send('123456@qq.com','邮件主题','邮件内容')

express框架

  • express 基于 Node.js 平台,快速、开放、极简的 Web 开发框架
  • koa 基于 Node.js 平台的下一代 web 开发框架(Express的原班人马打造)

express基本使用

  • 安装:npm install express --save
// 引入express
const express = require('express')
// 实例化express
const app = express()
// 一个简单的api接口
app.get('/user/registor',(req,res)=>{
  console.log('有请求进来了:',req.url)// /user/login?us=xiaocuo&ps=123456
  // 接收get请求的参数
  console.log(req.query)// { us: 'xiaocuo', ps: '123456' }
  let {us,ps} = req.query
  if (us === 'xiaocuo' && ps === '123456') {
    res.send({"err":0,"msg":"login success"})
  } else {
    res.send({"err":-1,"msg":"login faild"})
  }
})
// 监听3000端口,启动服务
app.listen(3000,()=>{
  console.log('----------server start----------')
})

api接口

  • url = host + port + pathname
  • 请求方式 get / post
  • 参数
  • 返回值

get接口

  • req.query 接收get请求的参数
  • 对象格式的参数,如 {us: 'xiaocuo', ps: '123456'}

post接口

  • req.body 接收post请求的参数
  • console.log(req.body) // undefined
  • express不能直接解析消息体
  • 使用第三方插件body-parser解析消息体
  • 安装:npm install body-parser
const express = require('express')
const bodyparser = require('body-parser')
const app = express()
// app.use('path路径',回调函数) 使用中间件(插件)
// 第一个参数默认为'/',默认可以不写
// 第二个参数是函数,(req,res,next)=>{}
app.use(bodyparser.json()) //解析 application/json 数据
app.use(bodyparser.urlencoded({extened: false})) // 解析 www-form-urlencoded 数据

Express v4.16.0+ 直接支持解析post请求消息体
app.use(express.json()) //解析 application/json 数据
app.use(express.urlencoded()) // 解析 www-form-urlencoded 数据

router路由

路由:是指分组从源到目的地时,决定端到端路径的网络范围的进程
路由:是指路由器从一个接口上收到数据包,根据数据包的目的地址进行定向并转发到另一个接口的过程
大白话:路由是根据不同的 url 地址展示不同的内容或页面
前端路由:根据不同的url地址,前端控制页面内容展示
后端路由:根据不同的url请求地址,后端控制页面内容展示

// server.js
const express = require('express')
const app = express()
// 引入路由模块
const useRouter = require('./useRouter.js')
// 匹配路径'/user'时使用路由
app.use('/user',useRouter)
// 监听3000端口,启动服务
app.listen('3000',()=>{
  console.log('----------server start----------')
})

// userRouter.js
const express = require('express')
const router = express.Router() // 获得路由实例
// 接口'/user/login'
router.get('/login',(req,res)=>{
  res.send('user login ok')
})
// 接口'/user/registor'
router.get('/registor',(req,res)=>{
  res.send('user registor ok')
})
// 接口'/user/update'
router.get('/update',(req,res)=>{
  res.send('user update ok')
})
module.exports = router // 导出路由对象

middleware中间件

  • 内置中间件 (static)
  • 自定义中间件 (全局和局部)
  • 第三方中间件 (body-parser)
// 如果多个接口都需要验证token怎么办?
// 使用中间件拦截,处理一些相同逻辑
// 进入某个接口之前先被中间件拦截
// 执行next()之后才往下执行
// app.use('path路径',回调函数) 使用中间件(插件)
// 第一个参数默认为'/',默认可以不写
// 第二个参数是函数,(req,res,next)=>{}
// 全局中间件
app.use('/',(req,res,next)=>{// 自定义中间件(拦截器)
  console.log('全局中间件。。。')
  let {token} = req.query
  if (token) {
    next()// 继续往下执行
  } else {
    res.send({msg: '缺少token参数'})
  }
})
app.get('/test1',(req,res)=>{
  console.log('test1。。。')
  res.send({msg: 'test1 ok'})
})
app.get('/test2',(req,res)=>{
  console.log('test2。。。')
  res.send({msg: 'test2 ok'})
})

// 局部中间件,可以写多个
// app.get('/test1',fn1,fn2,fn3,fn4...)
app.get('/test1',(req,res,next)=>{
  console.log('局部中间件。。。')
  next()
},(req,res)=>{
  console.log('test1。。。')
  res.send({msg: 'test1 ok'})
})

静态资源目录 static

  • 指定一个目录,作为静态资源的默认目录
  • 相当于之前我们用的www目录
// app.use(express.static('绝对路径'))
// 当前目录的绝对路径 __dirname
// 将多个路径进行拼接 path.join()
app.use(express.static(path.join(__dirname,'./hehe')))
// 等价于
app.use('/',express.static(path.join(__dirname,'./hehe')))
// 直接访问localhost:3008/c1.jpg可以访问到hehe目录的资源

app.use('/public',express.static(path.join(__dirname,'./hehe')))
// 指定一个路径作为静态资源路径,访问localhost:3008/public/c1.jpg

接口测试工具

  • postman

Q.E.D.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值