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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草莓小子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值