nodejs内置模块文档一
好用工具
npm的使用
# 初始化工程
npm init
# 安装第三方包
npm install 包名 -g # -g 全局安装 uninstall & update
npm install 包名 --save # --save依赖
npm install 包名 --save-dev # 开发依赖
npm list -g # 不加-g列举当前目录的安装包 -g 全局
npm info 包名 # (详细信息)
npm info 包名 version # (获取最新版本)
npm install 包名@版本号 # 安装指定版本
npm outdated # 检查包是否过时
安装nrm
# 全局安装nrm
npm install -g nrm
# 查看可选的源
nrm ls
# 使用淘宝镜像
nrm use taobao
# 测试速度
nrm test
安装yarn
# 安装yarn
npm install -g yarn
# 初始化
yarn init
# 添加包
yarn add package
yarn add package@version
# 更新包
yarn upgrade package@version
# 删除包
yarn remove package
# 安装全部依赖
yarn install
内置模块
http模块
// 导入http
const http = require("http")
// 创建服务器
let server = http.createServer(function(req, res) {
// req 接收浏览器传的参数
if (req.url === "favicon.ico") {
// TODO
return
}
console.log(req.url) // 路径
// res 返回渲染的内容
res.writeHead(200, {"Content-type": "text/html;charset=utf-8"})
res.write(renderHTML(req.url))// 向浏览器输出数据
// res.end("[1, 2, 3]")// 结束
res.end()
}).listen(3000, () => {
console.log("server start")
})
function renderHTML(url) {
if(url === "/home") {
return `<html>
<b>hello world首页</b>
</html>`
}
else if(url === "/list") {
return `<html>
<b>hello world表</b>
</html>`
}
return ""
}
url模块
// 导入http
const http = require("http")
// 导入url模块
const url = require("url")
// 创建服务器
let server = http.createServer(function(req, res) {
// req 接收浏览器传的参数
if (req.url === "favicon.ico") {
// TODO
return
}
// console.log(req)
// 通过url模块解析路径
// console.log(url.parse(req.url).pathname) // 路径
// 参数
// console.log(url.parse(req.url, true).query)
let pathurl = url.parse(req.url).pathname
// res 返回渲染的内容
res.writeHead(200, {"Content-type": "text/html;charset=utf-8"})
// 将解析好的路径放入
res.write(renderHTML(pathurl))// 向浏览器输出数据
// res.end("[1, 2, 3]")// 结束
res.end()
}).listen(3000, () => {
console.log("server start")
})
function renderHTML(url) {
if(url === "/home") {
return `<html>
<b>hello world首页</b>
</html>`
}
else if(url === "/list") {
return `<html>
<b>hello world表</b>
</html>`
}
return ""
}
querystring模块
// 导入querystring
const queryString = require("querystring");
// 定义字符串
let str = "name=kev&age=19&sex=1";
// 解析为对象
let obj = queryString.parse(str);
console.log(obj);
// 定义对象
let obj2 = {
a: 3,
b: 4,
c: 5,
}
// 解析为字符串
let str2 = queryString.stringify(obj2)
console.log(str2)
http模块补充
jsonp补充
const http = require("http")
const url = require("url")
let server = http.createServer((req, res) => {
// true将参数转换为对象方便使用
let urlobj = url.parse(req.url, true)
switch(urlobj.pathname) {
case "/api/home":
res.end(`${urlobj.query.callback}(${JSON.stringify({
name: "zhansan",
age: 19
})})`)
break
default:
res.end("404")
break
}
}).listen(3000)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<script>
// 动态创建script标签
var oscript = document.createElement("script")
// 添加属性
oscript.src = "http://localhost:3000/api/home?callback=test"
// 追加到页面中
document.body.appendChild(oscript)
function test(obj) {
console.log(obj)
}
</script>
</body>
</html>
跨域问题
const http = require("http")
const url = require("url")
let server = http.createServer((req, res) => {
// true将参数转换为对象方便使用
let urlobj = url.parse(req.url, true)
res.writeHead(200, {
"Content-Type": "application/json;charset=utf-8",
// 跨域问题解决
"access-control-allow-origin": "*"
})
switch(urlobj.pathname) {
case "/api/home":
res.end(`${JSON.stringify({
name: "zhansan",
age: 19
})}`)
break
default:
res.end("404")
break
}
}).listen(3000)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script src="js/jquery-3.6.0.min.js"></script>
</head>
<body>
<script>
$.ajax({
url: "http://localhost:3000/api/home",
type: "GET",
success: function(data) {
console.log(data)
},
dataType: "json"
})
</script>
</body>
</html>
http发送get请求
const http = require("http")
// 导入https模块
const https = require("https")
const url = require("url")
let server = http.createServer((req, res) => {
// true将参数转换为对象方便使用
let urlobj = url.parse(req.url, true)
res.writeHead(200, {
"Content-Type": "application/json;charset=utf-8",
// 跨域问题解决
"access-control-allow-origin": "*"
})
switch(urlobj.pathname) {
case "/api/home":
// 客户端,去猫眼要数据
// httpGet(data => res.end(data))
httpGet(res)
break
default:
res.end("404")
break
}
}).listen(3000)
// 发送get请求
// function httpGet(cb) {
// let data = ""
// https.get('https://i.maoyan.com/api/mmdb/movie/v3/list/hot.json?ct=%E5%B8%B8%E5%BE%B7&ci=268&channelId=4',
// res => {
// res.on("data", (chunk) => {
// data += chunk
// })
// res.on("end", () => {
// // console.log(data)
// cb(data)
// })
// })
// }
function httpGet(response) {
let data = ""
https.get('https://i.maoyan.com/api/mmdb/movie/v3/list/hot.json?ct=%E5%B8%B8%E5%BE%B7&ci=268&channelId=4',
res => {
res.on("data", (chunk) => {
data += chunk
})
res.on("end", () => {
// console.log(data)
response.end(data)
})
})
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script src="js/jquery-3.6.0.min.js"></script>
</head>
<body>
<script>
$.ajax({
url: "http://localhost:3000/api/home",
type: "GET",
success: function(data) {
console.log(data)
}
})
</script>
</body>
</html>
http发送post请求
const http = require("http")
// 导入https模块
const https = require("https")
const url = require("url")
let server = http.createServer((req, res) => {
// true将参数转换为对象方便使用
let urlobj = url.parse(req.url, true)
res.writeHead(200, {
"Content-Type": "application/json;charset=utf-8",
// 跨域问题解决
"access-control-allow-origin": "*"
})
switch(urlobj.pathname) {
case "/api/home":
// 客户端,去小米有品要数据
// httpGet(data => res.end(data))
httpPost(res)
break
default:
res.end("404")
break
}
}).listen(3000)
// function httpGet(cb) {
// let data = ""
// https.get('https://i.maoyan.com/api/mmdb/movie/v3/list/hot.json?ct=%E5%B8%B8%E5%BE%B7&ci=268&channelId=4',
// res => {
// res.on("data", (chunk) => {
// data += chunk
// })
// res.on("end", () => {
// // console.log(data)
// cb(data)
// })
// })
// }
// 发送POST请求
function httpPost(response) {
let data = ""
let options = {
hostname: "m.xiaomiyoupin.com",
post: "443",
path: "/mtop/market/search/placeHolder",
method: "POST",
headers: {
"Content-Type":"application/json"
}
}
let req = https.request(options,
res => {
res.on("data", (chunk)=> {
data += chunk
})
res.on("end", () => {
response.end(data)
})
})
req.write(JSON.stringify([{},{"baseParam":{"ypClient":1}}]))
req.end()
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script src="js/jquery-3.6.0.min.js"></script>
</head>
<body>
<script>
$.ajax({
url: "http://localhost:3000/api/home",
type: "GET",
success: function(data) {
console.log(data)
}
})
</script>
</body>
</html>
http爬虫简单使用
const http = require("http")
// 导入https模块
const https = require("https")
const url = require("url")
const cheerio = require("cheerio")
let server = http.createServer((req, res) => {
// true将参数转换为对象方便使用
let urlobj = url.parse(req.url, true)
res.writeHead(200, {
"Content-Type": "application/json;charset=utf-8",
// 跨域问题解决
"access-control-allow-origin": "*"
})
switch(urlobj.pathname) {
case "/api/home":
// 客户端,去猫眼要数据
httpGet(data => res.end(spider(data)))
// httpGet(res)
break
default:
res.end("404")
break
}
}).listen(3000)
// 发送get请求
function httpGet(cb) {
let data = ""
https.get('https://i.maoyan.com/',
res => {
res.on("data", (chunk) => {
data += chunk
})
res.on("end", () => {
// console.log(data)
cb(data)
})
})
}
// 爬取数据
function spider(data) {
// npm i --save cheerio
let $ = cheerio.load(data)
let $movielist = $(".column.content")
// console.log($movielist)
let movies = []
$movielist.each((index, value) => {
movies.push({
title: $(value).find(".title").text(),
grade: $(value).find(".grade").text(),
actor: $(value).find(".actor").text()
})
})
// console.log(movies)
return JSON.stringify(movies)
}
events模块
const EventEmitter = require("events")
class MyEventEmitter extends EventEmitter {
}
const event = new MyEventEmitter()
// 监听
event.on('play', movie => console.log(movie))
// 触发
event.emit('play', '我和我的祖国')
event.emit('play', '中国机长')
const EventEmitter = require("events")
const http = require("http")
// 导入https模块
const https = require("https")
const url = require("url")
let event = null
let server = http.createServer((req, res) => {
// true将参数转换为对象方便使用
let urlobj = url.parse(req.url, true)
res.writeHead(200, {
"Content-Type": "application/json;charset=utf-8",
// 跨域问题解决
"access-control-allow-origin": "*"
})
switch(urlobj.pathname) {
case "/api/home":
// 客户端,去猫眼要数据
event = new EventEmitter()
event.on('play', (data) => {
res.end(data)
})
httpGet()
break
default:
res.end("404")
break
}
}).listen(3000)
// 发送get请求
function httpGet() {
let data = ""
https.get('https://i.maoyan.com/api/mmdb/movie/v3/list/hot.json?ct=%E5%B8%B8%E5%BE%B7&ci=268&channelId=4',
res => {
res.on("data", (chunk) => {
data += chunk
})
res.on("end", () => {
// console.log(data)
// cb(data)
event.emit("play", data)
})
})
}
fs文件操作模块
const fs = require("fs")
// 创建目录文件夹
fs.mkdir("./avatar", (err) => {
console.log(err)
})
const fs = require("fs")
// 重命名文件夹
fs.rename("./avatar", "./avatar2", (err) => {
console.log(err)
})
const fs = require("fs")
// 删除文件夹
fs.rmdir("./avatar2", err => console.log(err))
const fs = require("fs")
/**
* 将文件写入文件夹
*/
// 会覆盖以前的内容
fs.writeFile("./avatar/a.txt", "hello world", err => console.log(err))
// 不会覆盖以前的内容
fs.appendFile("./avatar/a.txt", "\nhello world", err => console.log(err))
const fs = require("fs")
// 读取文件内容
fs.readFile("./avatar/a.txt","utf-8", (err, data) => {
if(!err) {
console.log(data.toString())
}
})
const fs = require("fs")
// 删除文件
fs.unlink("./avatar/a.txt", err => console.log(err))
const fs = require("fs")
// 读取目录
fs.readdir("./avatar", (err, data) => {
if(!err) {
console.log(data)
}
})
const fs = require("fs")
// 查看信息
fs.stat("./avatar/a.txt", (err, data) => {
// 是否为文件
console.log(data.isFile())
// 是否为目录
console.log(data.isDirectory())
})
const fs = require("fs")
// 同步删除有内容的文件夹
fs.readdir("./avatar", (err, data) => {
// console.log(data)
data.forEach((value) => {
let statsObj = fs.statSync("./avatar/"+value)
if(statsObj.isFile()) {
fs.unlinkSync("./avatar/"+value)
}
if(statsObj.isDirectory()) {
fs.rmdirSync("./avatar/"+value, {
recursive: true
})
}
})
fs.rmdir("./avatar", err => console.log(err))
})
const fs = require("fs").promises
// 异步删除有内容的文件夹
fs.readdir("./avatar").then(async data => {
let arr = []
data.forEach(item => {
arr.push(fs.unlink(`./avatar/${item}`))
})
await Promise.all(arr)
await fs.rmdir("./avatar")
})
stream模块
const fs = require("fs")
// 打开一个流,读取文件
let rs = fs.createReadStream("./a.txt", "utf-8")
rs.on("data", (chunk) => {
console.log(chunk)
})
rs.on("end", () => {
console.log("end")
})
rs.on("error", (err) => {
console.log(err)
})
const fs = require("fs")
// 创建一个流,写文件
const ws = fs.createWriteStream("./b.txt", "utf-8")
ws.write("11111111")
ws.write("\n22222222")
// 结束
ws.end()
const fs = require("fs")
// 将a.txt文件的内容复制到b.txt
const readStream = fs.createReadStream("./a.txt", "utf-8")
const writeStream = fs.createWriteStream("./b.txt", "utf-8")
readStream.pipe(writeStream)
zlib模块
const fs = require("fs");
const zlib = require("zlib");
// gzip格式
const gzip = zlib.createGzip();
const readStream = fs.createReadStream("./a.txt");
const writeStream = fs.createWriteStream("./b.txt");
// 将a.txt文件的内容压缩并放入b.txt文件
readStream.pipe(gzip).pipe(writeStream);
crypto模块
提供通用的加密和哈希算法
MD5是一种常用的哈希算法,用于给任意一个数据一个签名,这个签名通常用一个十六进制的字符串表示
const crypto = require("crypto")
const hash = crypto.createHash('md5')
// 可任意多次调用update()
hash.update("hello world")
hash.update("hello nodejs")
console.log(hash.digest("hex"))
update()方法默认字符串编码为utf-8,也可以传入Buffer
如果要计算SHA1,只要把"md5"改成"sha1",就可以得到SHA1的结果
Hmac算法也是一种哈希算法,它可以利用MD5或SHA1等哈希算法,不同的是,Hmac算法还需要一个密钥
const crypto = require("crypto")
const hmac = crypto.createHmac("sha256", "secret-key")
hmac.update("hello world")
hmac.update("hello nodejs")
console.log(hmac.digest("hex"))
只要密钥发生了变化,输入的数据就会得到不同的签名,因此,可以把Hmac理解为用随机数增强的哈希算法
AES是一种常用的对称加密算法,加解密都用同一个密钥,crypto提供了AES支持,但是需要自己封装好函数,便于使用
const crypto = require("crypto")
// 加密
function encrypt(key, iv, data) {
let decipher = crypto.createCipheriv('aes-128-cbc', key, iv)
return decipher.update(data, 'binary', 'hex') + decipher.final("hex")
}
// 解密
function decrypt(key, iv, crypted) {
crypted = Buffer.from(crypted, 'hex').toString('binary')
let decipher = crypto.createDecipheriv("aes-128-cbc", key, iv)
return decipher.update(crypted, 'binary', 'utf8') + decipher.final("utf8")
}
let key = "abcdef1234567890"
let iv = "tbcdey1234567890"
let data = "kerwin"
let crypted = encrypt(key, iv, data)
let _data = decrypt(key, iv, crypted)
console.log(crypted, _data)