模块的分类
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请求/接口 →查