nodejs-02

创建http客户端

  • http.get()
  • http.request()
// 加载模块
const https = requeire('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('utf8')) // 字符串
    resData += chunk.toString('utf8')
  })
  // 数据流传输完毕触发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模块

  • 第三方模块nodemailer用于发送邮件
    • 安装:npm install nodemailer
    • 查看官方文档:https://nodemailer.com/about/

封装一个发邮件的模块

let mail = require('./mail.js')
mail.send('123456@qq.com','邮件主题','邮件消息')
const nodemailer = require("nodemailer");
// 创建发送邮件的对象
let transporter = nodemailer.createTransport({
  host: "smtp.ethereal.email",// 发送方邮箱(下方的查找)
  port: 587,// 端口号
  secure: false, // 端口是465为true, 其他端口为false
  auth: {
    user: testAccount.user, // 发送方的邮箱地址,如:9935885@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 只能二选一
// 发送邮件
transporter.sendMail(mailInfo);
// 邮件轰炸
// setInterval(()=>{
//   transporter.sendMail(mailInfo);
// },2000)

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
  • 参数
  • 返回值

接口测试工具

-postman

get接口

  • req.query 接收get请求的参数
  • 对象格式的参数,如 {us: ‘xiaocuo’, ps: ‘123456’}
// 加载模块
const express = require('express')
// 实例化express对象
const app = express()

// 一个最简单的api接口,get接口地址:http://localhost:3001/user/login
app.get('/user/login',(req,res)=>{
  // 获取get请求的参数:req.url -> path   req.query
  // console.log(req.query);// { user: 'zhangsan', pass: '123456' }
  let {user,pass} = req.query
  if (user === 'zhangsan'&&pass === '123456') {
    res.send({err:1,msg:'登录成功'})
  } else {
    res.send({err:0,msg:'账号或密码错误'})
  }
  // res.end("{err:0,msg:'注册成功'}")// end返回数据不能直接写对象,json字符串
  // res.send({err:1,msg:'注册成功'})// 可以直接返回json对象
})

app.get('/user/register',(req,res)=>{
  // 获取get请求的参数:req.url -> path   req.query
  // console.log(req.query);// { user: 'zhangsan', pass: '123456' }
  let {user,pass} = req.query
  if (user === 'zhangsan') {
    res.send({err:0,msg:'账号已存在'})
  } else {
    res.send({err:1,msg:'注册成功'})
  }
})

// 一个api接口必备的几点:
// 1. url = host + port + pathname
// 2. 请求方式:get / post
// 3. 参数:user用户账号,pass账号密码
// 4. 返回值:{err:1,msg:'登录成功'}

// 监听端口,启动服务
app.listen(3001,()=>{
  console.log('-----------server start------------');
})

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()) //解析json数据
app.use(bodyparser.urlencoded({extened: false})) // 解析表单数据
  • post.js
// 加载模块
const express = require('express')
const bodyParser = require('body-parser')
// 实例化express对象
const app = express()
// 使用中间件(拦截器)
// app.use('path', 回调函数) 
// 第一个参数是要拦截的路径,默认为'/',默认参数可以不写
// 第二个参数是拦截到某个路径之后执行的函数 (next)=>{ 执行next()之后才会进入下一步 }
app.use(bodyParser.urlencoded({ extended: false }))
// 等价于如下写法
// app.use('/',bodyParser.urlencoded({ extended: false }))

// 一个最简单的api接口,post接口地址:http://localhost:3001/user/login
app.post('/user/login',(req,res)=>{
  // 获取post请求的参数:req.body
  // console.log(req.body);// undefined  
  // 原因:express框架不能直接解析消息体
  // 需要第三方模块来解析消息体:body-parser
  // console.log(req.body);// { user: 'zhangsan', pass: '123456' }

  let {user,pass} = req.body
  if (user === 'zhangsan'&&pass === '123456') {
    res.send({err:1,msg:'登录成功'})
  } else {
    res.send({err:0,msg:'账号或密码错误'})
  }
})

// 一个api接口必备的几点:
// 1. url = host + port + pathname
// 2. 请求方式:get / post
// 3. 参数:user用户账号,pass账号密码
// 4. 返回值:{err:1,msg:'登录成功'}

// 监听端口,启动服务
app.listen(3002,()=>{
  console.log('-----------server start------------');
})

router路由

// 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'})
})
// 加载模块
const express = require('express')
const app = express()

// 自定义中间件(全局)
// app.use('/',(req,res,next)=>{
  // console.log('拦截所有请求。。。');
  // let {token} = req.query
  // if (token) {
  //   console.log('有token值');
  //   next() // 之后后面的程序
  // } else {
  //   return res.send({err:-1,msg:'参数缺失'})
  // }
// })

// 自定义局部中间件
// app.get('path',fn1,fn2,fn3...)
app.get('/user/login',(req,res,next)=>{
  console.log('拦截login请求。。。');
  let {token} = req.query
  if (token) {
    console.log('有token值');
    next() // 之后后面的程序
  } else {
    return res.send({err:-1,msg:'参数缺失'})
  }
},(req,res)=>{
  let {user,pass} = req.query
  if (user === 'zhangsan'&&pass === '123456') {
    res.send({err:0,msg:'登录成功'})
  } else {
    res.send({err:-2,msg:'账号或密码错误'})
  }
})

app.get('/user/register',(req,res)=>{
  let {user,pass} = req.query
  if (user === 'zhangsan') {
    res.send({err:-1,msg:'账号已存在'})
  } else {
    res.send({err:0,msg:'注册成功'})
  }
})

app.listen(3003,()=>{
  console.log('-----------server start------------');
})

静态资源目录 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')))
app.listen(3005,()=>{
  console.log('-----------server start------------');
})

// 指定一个路径作为静态资源路径,访问localhost:3008/public/c1.jpg
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值