node.js知识二

tech2026-08-22  9

模块的分类

1. 内置模块:node中自己携带的模块,可以放心直接使用。 2. 第三方模块:先下载模块在使用的模块。 3. 自定义模块:开发者按自己的需求自己定义的模块。

内置模块介绍

一:fs模块(文件操作模块)

文件夹的操作之创建文件夹fs.mkdirSync("./xixi")

异步→ fs.mkdir(path[options], callback)

1. 同步→fs.mkdirSync("./xixi")

2. 文件的操作 非阻塞异步的创建文件夹方法如下👇 fs.mkdir(path[options], callback) const fs=require(“fs”) const fs=require(“fs”)

// 如下创建文件夹 // 参数1 path填写一个路径表示你想在哪个地址下创建文件夹 // 参数2[option]表示可选参数,可以写可以不写 // 参数3callback表示回调函数的意思创建完成后就会执行这个回调函数 // fs.mkdir(path[options], callback) // 如下写法 console.log("node.js当中本来文件创建是一个阻塞的i/o模型,是什么原因可以让其变成非阻塞呢?"); fs.mkdir("./fs",function(err){ console.log("创建加创建完毕!") console.log(err) }) console.log("我们通过写回调函数就会让其变成非阻塞的i/o模型!");

看如下打印输出的结果(验证执行多个创建文件夹的代码时会报错)

同步的创建文件夹方法:如下👇: fs.mkdirSync("./xixi")

文件操作之删除文件夹 同步fs.rmdir() 异步fs.rmdirSync()

fs.rmdir("./haha",function(e){ if(e){ console.log("删除失败!") console.log("报错信息为→",e) } else{ console.log("删除成功!") } }) fs.rmdirSync("./fs1")

文件操作之修改文件夹 同步→fs.rename(参数1,参数2,回调) 参数1为你要修改的文件夹的地址以及名字 参数2是你要改成什么名字并且把他放到哪一个地址上

fs.rename("./fs","./fsgm",function(e){ if(e){console.log(e)} else{ console.log("修改成功!") } })

异步如下 fs.renameSync() 文件夹操作之读取文件夹 异步非阻塞:fs.readFile(参数1,回调) 参数1 为你要读取的那个文件的地址 参数2位回调函数,回调函数的第一个参数是报错信息,第二个参数是读取结果 CMD快捷键,在CMD当中如果想执行上一个已经执行过的命令那么直接按↑这个键,按F7可以弹出历史操作记录。

fs.readFile("./fsgm/d.html",function(err,infos){ if(err){ console.log("报错信息err是→",err) }else{ console.log(infos) } })

文件夹操作之写入文件 fs.writeFile() fs.writeFile(file, data[, options], callback) option可选参数可以填写’utf8’ . “binary”

参数file表示你需要在哪个文件下写入东西,填写的是文件的具体地址需要自己写上文件格式。(如果没有这个文件就会自动帮你创建一个文件) 参数data表示你要在file参数内部覆盖式的改写的 信息。【注意是覆盖式的改写】 Callback回调函数, 一般只用到回调函数的第一个参数err,表示报错信息。

const fs=require("fs") fs.writeFile("./file.js","var t='张亿'",function(err){ if(err){ console.log("错误信息为→",err) }else{ console.log("文件写入成功!") } })

fs.appendFile()的作用是修改内容。他和fs.writeFile()参数都是类似的 fs.appendFile()和fs.writeFile()唯一的区别是fs.writeFile()是覆盖式的改写,而fs.appendFile()是在后面添加一个内容(append)

删除一个文件(注意不是一个文件夹是文件和上面的删除文件夹fs.rmdir()不一样) fs.unlink(file,callback)

fs.unlink("./file.text",function(e){ if(e){ console.log("报错信息如👉",e) }else{ console.log("删除文件成功!") } }) 文件操作之读取文件 注意读取文件夹是fs.rename()而读取文件是fs.readFile() fs.readFile()参数1是文件地址,参数2 是一个【option】可选的配置参数(一般填utf8配置读取的字符编码),参数三是回调,回调的err参数为报错信息,data则为你读取到文件内部的信息。 fs.readFile("./file.text",function(err,data){ if(err){ console.log("报错信息如右→",err) }else{ // buffer 为二进制数据流是我们不认识的东西,如果要转化成我们认识的需要使用toString()方法进行转化一下。 console.log(data) } }) 如果不用toString()方法转换就是如下输出

转化后 fs.readFile("./file.text",function(err,data){ if(err){ console.log("报错信息如右→",err) }else{ // buffer 为二进制数据流我们需要用toString()转换 console.log(data.toString()) } })

当然如果你不想用toString方法转换那我们也可以有另一种解决方案 就是在readFile方法的参数当中加一个option配置参数在配置参数里写utf8 fs.stat(“参数1位你要读取的文件或文件夹地址”,“参数2为一个回调函数,回调函数颞部的参数1为错误信息err,参数2 是读取的结果”)加粗样式

如下dirent.isFile()判断是否是一个文件和dirent.isDirectory()判断是否是一个文件夹 方法需要在fs.stat方法的内部使用

dirent.isFile()判断是否是一个文件

dirent.isDirectory()判断是否是一个文件夹

fs.stat("./file.text",function(err,data){ if(err){ console.log("报错信息如右→",err) }else{ // buffer 为二进制数据流我们需要用toString()转换 console.log(data.toString()) // 用isDirectory()判断是否是一个文件夹返回值是一个布尔值 console.log(data.isDirectory()) // 用isFile()判断是否是一个文件夹 console.log(data.isFile()); } })

Require模块

const request = require('request'); request.get('https://cnodejs.org/api/v1/topics?page=1&limit=10', (error, response, body) => { // error: 错误信息,默认null // response: 相应对象 // body: 请求响应内容 console.log(body) }); //or request('https://cnodejs.org/api/v1/topics?page=1&limit=10', (error, response, body) => { console.log(body) }); 参数设置 const request = require('request'); request({ url: url, method: 'get', timeout: 10000, headers: {}, proxy: {} , agentOptions: {}, params: {} }, function(err, res, body) { });

url模块

var url = require('url');//加载url模块 var mine=require("./mime") const express=require("express") const fs=require("fs") const path=require("path") const app=express() app.use("/public",express.static(path.join(__dirname))) app.get("/url",(req,res)=>{ var t=url.parse(req.url) console.log("t是包含路径信息的对象",t); // 引入内置的url模块后 // url.parse()方法的作用 // 首先我们明确url.parse()方法括号内填写的参数是一个地址 // 把你想写的地址放在url.parse()方法使用后,输出的结果是一个包含地址信息的对象 // 结构赋值其中的pathname属性之后输出的是 // 除去http/https+localhost:端口号的地址 // 获取访问路径 const{pathname}=url.parse(req.url); console.log("除去http/https+localhost:端口号的地址",pathname); // 把路径转换为系统绝对路径 const realpath=path.join(__dirname,pathname) console.log("realpath",realpath); // 获取请求静态资源文件的后缀 // path.extname()方法的作用、 // 任意地址举个例子我们以src/js/张亿.png // 如果把地址放入到path.extname()方法当中 // 即path.extname(src/js/张亿.png)→输出结果为→.png【即得到点加上文件后缀名】 // 我们在利用字符串里面的substring(1)从索引1开始截取字符串,直至截取到结尾 // 所以我们最终extname获取的就是某地址下某文件的后缀名 const extname=path.extname(pathname).substring(1) // 利用FS模块读取静态资源、 fs.readFile(fs.realpath,(err,data)=>{ if(err){ return res.end("404") } res.writeHead(200,{"content-type":mime[extname]+";charset=utf8"}) res.end(data) }) }) app.listen(3600,()=>{ console.log("服务器端口3600已经成功被开启!"); }) module.exports = { "css": "text/css", "gif": "image/gif", "html": "text/html", "ico": "image/x-icon", "jpeg": "image/jpeg", "jpg": "image/jpeg", "js": "text/javascript", "json": "application/json", "pdf": "application/pdf", "png": "image/png", "svg": "image/svg+xml", "swf": "application/x-shockwave-flash", "tiff": "image/tiff", "txt": "text/plain", "wav": "audio/x-wav", "wma": "audio/x-ms-wma", "wmv": "video/x-ms-wmv", "xml": "text/xml" };

http模块

const http=require(“http”) const server=http.createServer((req,res)=>{ 设置响应头 res.writehead(200,{“Content-Type”:”text/html;charset=utf-8}) res.write(“响应结果是什么!”) res.write方法写完后必须写res.end才可以结束响应不然会出错 res.end() }

路径相关的path模块

__dirname

var path=require("path") // 引入了path模块之后那么__dirname就表示当前文件所在文件夹的绝对路径 console.log("当前文件的文件夹的绝对路径如右→",__dirname) var t=path.join(__dirname,"./路径.js")

path.join() path.join()

// path.join()可以有多个参数,这个方法的作用就是吧所有的参数拼接成一个路径 var t1=path.join(__dirname,"mjn","./路径.js") console.log("t1",t1)

nodemailer模块 nodemailer模块的官方地址https://nodemailer.com/about/

**// 邮箱轰炸器

// 通过第三方模块发送邮箱 nodemailer // 通过地址:node_modules/nodemailer/lib/well-know/services.json // 找到services.json文件,然后找到QQ复制其配置信息到创建发送邮件的对象中**

// 引入nodemailer模块 const nodemailer = require("nodemailer"); // 创建发送邮件的对象 let transporter = nodemailer.createTransport({ host: "smtp.qq.com", port:465, secure: true, // true for 465, false for other ports auth: { user: "2796522557@qq.com", // 发送方邮箱账号 pass: "xtqbwhnmbinwdhdj", // 邮箱的授权码 // 授权码的获取,登录自己的QQ邮箱,点击设置,点击常规右边的那个账户,找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 // 然后开启服务器→POP3/SMTP服务 (如何使用 Foxmail 等软件收发邮件?),点击开启,已关闭 | 开启,然后自己验证后就可以获取到 // 授权码了 }, }); // 邮件的内容 var content={ from: '2796522557@qq.com', // sender address→发送人地址,这个指的是邮件的发送方账号信息 // to: "2796522557@qq.com,411620704@qq.com",// list of receivers→接收者名单,邮件的接收方信息,如果要发送给多个账号用逗号隔开即可 to:"2796522557@qq.com,823571683@qq.com", subject: "Hello ✔", // Subject line(你要发送的内容的标题) // text和html只能二选一不能同时发所以我们选择如下发送html // text: "Hello world?", // plain text body(你想发送的纯文本内容) html: `<b>欢迎光临逆战1911</b>`, // html body(带有标签的html内容,会生成网页) } // 调用sendMail()发送邮件 // sendMail()第一个参数为发送的内容,第二个参数为回调函数。 setInterval(function(){ transporter.sendMail(content,function(err){ if(err){ console.log(err); }else{ console.log("邮件发送成功!") } }); },10000)

node.js之爬虫

配合http模块或者https模块获取网络资源(网页,记事本,图片,音频,视频) http.get(url,(res)=>{ res.on(“data”,(chunk)=>{}) res.on(“end”,(chunk)=>{}) })

var https=require("https") var fs=require("fs") var url="https://img04.sogoucdn.com/net/a/04/link?url=http%3A%2F%2Fimg03.sogoucdn.com%2Fapp%2Fa%2F100520024%2F968013acbc34fa232b16607a4b519eab&appid=122" https.get(url,(res)=>{ // 如果你想下载文本就要设置成res.setEncoding('utf8'); res.setEncoding("binary") // 如上 res.setEncoding("binary") // 是吧把请求的格式转成图片的格式,不然下载的图片失效 var t="" res.on("data",(chunk)=>{ t+=chunk }) res.on("end",(chunk)=>{ fs.writeFile("./图片/tp.jpg",t,"binary",function(err){ if(err){ console.log("图片下载失败!",err); }else{ console.log("图片下载成功!"); } }) }) }).on("err",function(err){ if(err){ console.log("图片下载失败!"); } } )

请求的方式以及作用 // 请求方式有,但是他们分别的规范作用如下【规范并不是规定可以遵守也可以不遵守】规范的名称叫做restful api规范 restful api规范的作用 是让程序员根据不同的请求类型规范接口的需求编写

【post,delete,(put,patch),get】→增删改查

我们常见的是post请求和get请求,其实很早之前就定义了规范,为什么put/patch【改】和delete删不常用呢?因为早期的浏览器对着它们的接口支持度不好.所以大家都用post和get请求了

post请求/接口 // post请求/接口 →增 delete请求/接口 // delete请求/接口 →删 put请求/接口 // put请求/接口 →改【修改一部分】 patch请求/接口 // patch请求/接口 →改【覆盖式的改,全部改。】 get请求/接口 // get请求/接口 →查
最新回复(0)