一 、 module
内置模块
Stream 流: 什么是流?Node中为什么要有流这个概念? 使用场景?
流指的是数据流,指的是数据是分片传输
数据可以实现非阻塞
gulp 【 流式操作 】
流程: 1. 读取文件
2. 创建压缩包
3. 将读取的数据流写入压缩包
4. 输出压缩包
案例: 打包压缩包
const fs = require(‘fs’) // 读取yyb.txt文件
const zlib = require(‘zlib’) // 创建压缩包
// const inp = fs.createReadStream( 路径 )
const inp = fs.createReadStream(’./yyb.txt’) //读出数据
const gzip = zlib.createGzip() // 创建压缩包
// const outp = fs.createWriteStream(路径)
const outp = fs.createWriteStream(’./yyb.txt.gz’)
inp .pipe(gzip) .pipe(outp)
自定义模块
创建模块:
const name = {
id: 1,
name: ‘Gabriel Yan’
};
const str = ‘sdaf’;
导出模块:
// 只能导出一个
module.exports = name ;
// 批量导出
module.exports = {
name,
str
};
导入模块
// const { name,str } = require(路径)
const { name,str } = require(’./02-name.js’);
console.log( name.name , str );
第三方模块
一般都是从npmjs.com这个网站拉取
使用流程:
1. 安装
先创建package.json 文件
npm/cnpm i request -S/-D
-S --save 生产环境
-D --save-dev dev development的简写 开发环境
2. 使用: request这个模块是做数据请求
3. Node中数据请求存在跨域吗? – 不存在
const request = require(‘request’);
request(‘https://m.lagou.com/listmore.json’, (a, b, c) => {
console.log(‘a’, a); // error
console.log(‘b’, b); // response 返回所有结果
console.log(‘c’, c); // body 数据 string
});
二 、http
http.get
http.request
业务: 从nowapi中找一个免费接口,进行数据请求
const http = require( ‘http’ )
http.get(‘http://api.k780.com/?app=weather.city&cou=1&appkey=43880&sign=6a31f4fe1408d69bb0417b046eeae5b6&format=json’,
(res) => {
const { statusCode } = res; // 获取请求状态码 200 301 302 303 304 404 500
const contentType = res.headers[‘content-type’]; // 获取请求类型数据类型
// json数据的content-type ‘content-type’: ‘application/json’
let error;
if (statusCode !== 200) { // 如果状态码不是200 ,输出报错信息
error = new Error(‘Request Failed.\n’ +Status Code: ${statusCode}
);
} else if (!/^application/json/.test(contentType)) {
error = new Error(‘Invalid content-type.\n’ +Expected application/json but received ${contentType}
);
}
if (error) { // 如果报错了,将报错信息存入日志
console.error(error.message);
// consume response data to free up memory
res.resume();
return;
}
res.setEncoding(‘utf8’); // 字符编码
let rawData = ‘’;
res.on(‘data’, (chunk) => { rawData += chunk; }); // 通过data事件拼接数据流
res.on(‘end’, () => { // 获取数据结束了
try { // 高级编程语法 捕获错误信息
console.log( rawData );
} catch (e) {
console.error(e.message);
}
});
}).on(‘error’, (e) => {
console.error(Got error: ${e.message}
);
});
http - spider
- 爬虫
去某一个网站爬取一段数据 -> 数据清洗 -> 后端服务器 -> 发送前端 -> 渲染数据
不是所有网站都可以爬取 - 反爬虫
爬虫: 后端渲染的网站
const http = require( ‘http’ );
// 引入第三方类库
const cheerio = require( ‘cheerio’ );
const options = {
hostname: ‘jx.1000phone.net’,
port: 80,
path: ‘/teacher.php/Class/classDetail/param/rqiWlsefmajGmqJhXXWhl3ZiZGZp’,
method: ‘GET’,
headers: {
Accept: ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3’,
‘Accept-Encoding’: ‘gzip, deflate’,
‘Accept-Language’: ‘zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7’,
‘Cache-Control’:’ no-cache’,
Cookie: ‘PHPSESSID=ST-159231-9hv0Ja04QabYv-n5OYwWsQFVfjw-izm5ejd5j1npj2pjc7i3v4z’,
Host: ‘jx.1000phone.net’,
Pragma: ‘no-cache’,
‘Proxy-Connection’: ‘keep-alive’,
Referer: ‘http://jx.1000phone.net/teacher.php/Class/index’,
‘Upgrade-Insecure-Requests’: 1,
‘User-Agent’:’ Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36’,
‘Content-Type’: ‘application/x-www-form-urlencoded’,
‘Content-Length’: 0
}
}
http.get( options, (res) => {
const { statusCode } = res; // 获取请求状态码 200 301 302 303 304 404 500
const contentType = res.headers[‘content-type’]; // 获取请求类型数据类型
res.setEncoding(‘utf8’); // 字符编码
let rawData = ‘’;
res.on(‘data’, (chunk) => { rawData += chunk; }); // 通过data事件拼接数据流
res.on(‘end’, () => { // 获取数据结束了
try { // 高级编程语法 捕获错误信息
// console.log( rawData )
const $ = cheerio.load( rawData )
$(‘td.student a’).each(function (index,item) {
console.log( $( this ).text() + ‘—’ + index )
})
} catch (e) {
console.error(e.message);
}
});
}).on(‘error’, (e) => {
console.error(Got error: ${e.message}
);
});;
http - server
a. 后端服务器有两种类型
1. web服务器 【 静态服务器 】
2. api服务器 【 暴露接口 】
b. 请求头部报文
1. general 请求基本信息
2. response Headers 响应头
3. request Headers 请求头
4. 携带参数
- query string paramters get请求
- form data post 请求
const http = require( ‘http’ )
const host = ‘localhost’
const port = 8000
http.createServer(( request,response ) => {
// response.writeHead( 状态码,请求头 )
response.writeHead( 200, {
‘Content-type’: ‘text/html;charset=utf8’
})
response.write(’
这里使用Node创建的一个静态服务器
') // 往前端发送信息response.end() // 告诉前端信息已经结束了
}).listen( port,host,() => {
console.log( The server is running at: http://${ host }:${ port }
)
})
fs
Node.js读取文件都是二进制流
- Buffer
- binary
const fs = require( ‘fs’ )
fs.readFile(’./yyb.txt’,( error, docs ) => {
console.log( docs.toString() )
})
fs.readFile(’./yyb.txt’,‘utf8’,( error, docs ) => {
console.log( docs.toString() )
})
http - spider - server
a. 后端服务器有两种类型
1. web服务器 【 静态服务器 】
2. api服务器 【 暴露接口 】
b. 请求头部报文
1. general 请求基本信息
2. response Headers 响应头
3. request Headers 请求头
4. 携带参数
- query string paramters get请求
- form data post 请求
const http = require( ‘http’ )
const host = ‘localhost’
const port = 8000
http.createServer(( request,response ) => {
// response.writeHead( 状态码,请求头 )
response.writeHead( 200, {
‘Content-type’: ‘text/html;charset=utf8’
})
const http = require( 'http' )
// 引入第三方类库
const cheerio = require( 'cheerio' )
const options = {
hostname: 'jx.1000phone.net',
port: 80,
path: '/teacher.php/Class/classDetail/param/rqiWlsefmajGmqJhXXWhl3ZiZGZp',
method: 'GET',
headers: {
Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'Cache-Control':' no-cache',
Cookie: 'PHPSESSID=ST-159231-9hv0Ja04QabYv-n5OYwWsQFVfjw-izm5ejd5j1npj2pjc7i3v4z',
Host: 'jx.1000phone.net',
Pragma: 'no-cache',
'Proxy-Connection': 'keep-alive',
Referer: 'http://jx.1000phone.net/teacher.php/Class/index',
'Upgrade-Insecure-Requests': 1,
'User-Agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': 0
}
}
http.get( options, (res) => {
const { statusCode } = res; // 获取请求状态码 200 301 302 303 304 404 500
const contentType = res.headers['content-type']; // 获取请求类型数据类型
res.setEncoding('utf8'); // 字符编码
let rawData = '';
res.on('data', (chunk) => { rawData += chunk; }); // 通过data事件拼接数据流
res.on('end', () => { // 获取数据结束了
try { // 高级编程语法 捕获错误信息
// console.log( rawData )
const $ = cheerio.load( rawData )
$('td.student a').each(function (index,item) {
response.write(`<h3> ${ $( this ).text() } </h3>`) // 往前端发送信息
})
response.end() // 告诉前端信息已经结束了
} catch (e) {
console.error(e.message);
}
});
}).on('error', (e) => {
console.error(`Got error: ${e.message}`);
});
}).listen( port,host,() => {
console.log( `The server is running at: http://host:{
三 、 event
Node.js中event模块
Node.js中 事件的发布 + 事件的订阅 表示一个任务的执行
const Events = require(‘events’)
const fs = require(‘fs’)
const http = require(‘http’)
const host = ‘localhost’
const port = 3000
class myEvent extends Events { } //类的继承
const myevent = new myEvent() // 实例化类得到一个实例
事件的发布:
// myevent.on(事件名称,事件的回调函数)
myevent.on(‘aa’, function () {
// 书写任务
// 任务: 将yyb.txt中的内容发送前台
http.createServer((req, res) => {
res.writeHead(200, {
‘Content-Type’: ‘text/html;charset=utf8’
})
fs.readFile(’./yyb.txt’, ‘utf8’, (error, docs) => { // error作为第一个参数的回调函数,我们叫做错误优先的回调函数
res.write(<h3> ${docs} </h3>
)
res.end()
})
}).listen(port, host, () => {
console.log(服务器运行在: http://${host}:${port}
)
})
})
事件的订阅:
// myevent.emit(事件名称)
myevent.emit(‘aa’);
四 、proxy
后端
api服务器
Node.js中api服务器的创建,我们使用一个第三方库 express
后端解决跨域问题:
1. 设置请求头
2. 使用中间件
第三方的包 cors
const express = require(‘express’)
const app = express() // 得到一个app对象
const port = 3000
const host = ‘localhost’
const cors = require(‘cors’)
// 创建接口
app.use(cors({
“origin”: “*”,
“methods”: “GET,HEAD,PUT,PATCH,POST,DELETE”,
“preflightContinue”: false,
“optionsSuccessStatus”: 200
}))
app.get(’/user’, (req, res, next) => { // 回调函数我们称之为: 中间件 具有特定功能的一个函数
res.json({
id: 1,
name: ‘张三’,
class: ‘1905’
})
})
app.get(’/demo’, (req, res, next) => { // 回调函数我们称之为: 中间件 具有特定功能的一个函数
res.json({
id: 2,
name: ‘赵四’,
class: ‘1905’
})
})
// 创建api服务器,并监听这个服务器
app.listen(port, host, () => {
console.log(The server is running at : http://${host}:${port}
)
})
五 、 transpond
反向代理的基本原理
我们的后端帮助我们请求数据 , 在将数据发送给我们自己前端
任务:
1. 后端请求数据
2. 将数据发送给前端 api服务器 express
const request = require( ‘request’ )
const express = require( ‘express’ )
const host = ‘localhost’
const port = 3000
const app = express()
const url = ‘https://m.lagou.com/listmore.json’
//创建接口
app.get(’/position’, ( req,res,next ) => {
res.setHeader(‘Access-Control-Allow-Origin’, ‘*’); // 设置请求头跨域
// 数据请求
request( url, ( error,response,body ) => {
res.json( JSON.parse( body ) )
})
})
app.listen( port,host, () => {
console.log( The server is running at: http://${ host }:${ port }
)
})