md文件笔记的编写
node
what
- chrome VB runtime
- 事件驱动
- 非阻塞的 i/o
i/o:input output 输入输出流 正常下i/o的操作都是阻塞的(ajax同步)
网络请求 数据库处理 文件的读写。。。。
优点:高并发特别好
why
- 防止甩锅,明确数据交互的错误问题在谁
- 能够书写api,斜杠青年
- 了解前后端的交互流程
- 全栈工程师
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();
打印当前目录的目录树
- 实现的效果
- 分析功能点
- 当前目录结构
- 分辨是文件还是文件夹
内置模块 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 对象转字符串
爬虫案例
- 获取目标网站 http.get
- 分析网站内容 cheerio 可以使用jq里的选择器
npm install cheerio --save - 获取有效信息 下载或者其他操作 下载或者其他操作
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服务器