创建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)
})
})
爬虫
- 获取目标网站
- http.get()
- http.request()
- 分析网站内容(解析字符串、正则匹配)
- 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)
})
- 获取信息(下载或其他操作)
nodemailer模块
- 第三方模块nodemailer用于发送邮件
- 安装:npm install nodemailer
- 查看官方文档:https://nodemailer.com/about/
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验证码设置
- 登录QQ邮箱首页
- 点击左上方的 设置 -> 账户 -> 开启服务 -> 开启POP3/SMTP服务
- 验证账号身份后获得授权码: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.