node.js知识二

模块的分类

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值