Nodejs关于fs与http模块的基本知识

171 阅读9分钟

一、基础准备

1、node终端

1.cmd(命令行):①win+r 调出cmd ②右击调出windows PowerShell 作用>:写代码并查看结果

2.软件visual Studio Code 终端 powershell 作用:写代码并查看结果

3.浏览器的console控制台也是可以进行写代码并查看终端的

注意:终端和文件没有关系,它只是一个编译器

3.检查node环境是否安装
//cmd中解释程序窗口:node -v //会显示当前安装的node环境的版本号 是否成功 (v是版本首写)
//在文件夹的地址栏中输入cmd,然后检查:node -v 判断是否安装成功
关于cmd的命令
//D:表示进入D磁盘  C:表示进入c磁盘
//dir:显示文件列表
3.终端常用命令符
需求 操作符
终端在当前页面 ctrl+c 连续摁两次
返回上一级 cd .. 回车
运行当前页面结果 node 文件名 回车
4.关于cmd的命令符
需求 操作符
进入某个磁盘 D:
显示当前文件的中的文件 dir

二、文件模块

1.读取文件
调用文件模块系统
var fs = require("fs")
读取文件
fs.readFile("路径""编码格式",回调函数(err,data));
解释:
属于方法,共计三个参数,文件路径,编码格式,以及调用文件后的操作方式(函数);前两个语法格式是字符串
文件路径:用于查找到文件
编码格式:用于读取文件使用编译的方式
回调函数:主要用于读取文件后的操作,值也是用于回调函数使用的 如果没有错误输出错误就是null
案例:读取文件成功后,显示读取的文本,读取失败显示读取失败字样
            // fs.readFile("no/zhao.txt","utf-8",function(err,data){
            //     if(err){
            //         console.log("您输入的文件有错误")
            //     }else{
            //         console.log(data)
            //     }
            // })
2.写入文件
/*理解
语法格式:对象.写入文件("写入路径","数据",回调函数(err))
属于方法,共计三个形参,一个可选参数;写入路径和数据属于字符串
写入路径:用于写的文件存储的位置
数据data:用于给创建的文件中添加的数据内容
回调函数:值有一个err 用于回调函数中使用
作用:用于创建文件,并且写入数据
*/
案例:
const fs = require("fs");
fs.writeFile("no/xiao.txt","赵锐庆真帅!",function(err){
    console.log("写入成功了")
})
fs.readFile("no/xiao.txt","utf-8",function(err,data){
    if(err){
        console.log("亲爱的,读取错误了你")
    }else{
        console.log(data)
    }
})
3.数据类型的转换
/*
其实序列化和反序列化就是将数据类型进行转换,且不改变符号规则,序列化就是将正常数据专成字符串
反序列化就是将正常数据从字符串转回原来的数据;
JSON.stringify("对象") //返回的是该对象的被转换的类型需要变量去接收的
JSON.parse("对象")//返回的是该对象从字符串被专程json格式的数据
*/

三、创建服务器

1.数据传输协议http协议

一直以来对数据传输协议并不是太有了解,感觉不知道是什么,实际上呢,数据传输协议就是客户端和服务器必须遵循的服务器代码语法规范,就这些;可能起初是由人定出来的规定,但是已经转换成代码规范了,下面呢,会深入学习服务器和客户端之间的传输原理,也就包含了此协议规范。

2.数据传输概图

4.创建服务器
//首先调用http模块
var http = require("http");
//基于http创建服务器
var server = http.createServer()
//服务器创建完成,为服务器添加唯一的端口;端口不能是5000以下 还有3306 6379 不可以进行使用
server.listen(9000)
//到这里服务器创建完成,可以对服务器进行响应,但是服务器不能够进行反馈,且会一直等待服务器给反应,所以我们需要给服务器添加,访问事件,并且做出反馈。
server.on("request",function(res,req){
    req.write("你访问到我啦,我可是服务器!")
    req.end()//给出的反应要断开连接,否则是不可以连接过来的
})

服务器对象.(“请求事件”,回调函数(请求数据,响应数据){处理程序}) ①属于方法,有2个必填参数,第一个参数为字符串,第二个参数为回调函数 (格式语法释意) ②第一参数为请求事件,第二个参数为回调函数,回调函数中的值为请求数据的形参,和响应数据的形参,这两个形参是函数体中主要运用的属性方法的添加对象; ③释意:/

5.数据类型的头信息
响应数据对象.setHeader("content-type","text/plain;charset='utf-8'")
//①属于方法,添加的对象是响应数据的对象,有两个实参,为字符串格式
//②第一个参数为设置内容的类型,第二个参数是第一个参数的值类型,设置类型与具体的编码格式
//   编码格式影响到write的输出,write输出是否能够解析html都和告知浏览器的类型是有关系的
//③释意和目的:给传输的内容加文件头用于解析的时候告知浏览器该文本类型以及具体解析的格式,解决乱码问题
6.关于请求参数和响应参数的方法
响应参数的对象.write()
①属于方法,参数为字符串或者变量
②目的是用于响应给浏览器的文本或者数据,和设置头文件告知浏览器的数据类型是有关系的;
//在这里如果写的write想要自己改变自己,也可以在里面声明<!doctype html><meta charset="utf-8">
响应参数.end()
①属于方法,参数可以是data整个文本,这样的话可以省写write
②主要用于响应结束,断开使用;
7.不同的请求方案解决

因为浏览器调用html文件,html中的文件含有很多图片、多媒体的外链,采取的是相对路径,那么浏览器会默认把这个文件路径直接掉在我们服务器后缀后面,这个是不行的;

而且我们浏览器的执行请求到html文件后,执行html文件,遇到链接会再次请求,会产生多个请求,/请求的该html文档/img.ss.jpg是图片,那么我们可以根据这个URL请求文件不同,地址方式不同,可以做出判断,如果该次URL请求的是文档,那么久读取文档,返回文档,如果该次URL格式是图片,那么我们在去读取图片进行返回;根据url的地址类型不同,分文别类的去读取返回是有效的,总比读取任何url地址都返回一个要强的多的

//如果是对服务器的请求那么它请求的url  是  /
//如果是图片等资源的请求那么他的地址 是 /img/zhao.jpg
下面是关于不同请求链接的解决方案:
//引入http
var http = require("http")
//创建服务器
var server = http.createServer()
//创建服务器端口
server.listen(8100)
//引入文件系统模块
var fs = require("fs")
//为服务器添加请求响应事件
server.on("request",function(res,ret){
       //根据url地址形式读取调用文件 ,如果是/ 那么就读整个文档给他
    if(res.url=="/"){
        fs.readFile("./index.html",function(err,data){
                ret.end(data)
        });
    }else if(res.url){//根据url地址形式读取调用文件 ,如果是/.imgs.jpg 那么就读整个文档给他
        fs.readFile("."+res.url,function(err,data){
            ret.end(data)
        });
    }
});

四、文件管理系统

1.查看文件属性
两个属性
/*
fs.readdir("./",function(err,files))
fs文件对象.readFile("读取路径","函数(读取错误,读取到的文件){针对操作}")
①属于方法,参数有2个,路径和回调函数,路径是字符串,函数中有err和files的值
②第一个参数是路径
③第二哥参数callback 第一个形参是错误 第二个形参是存储返回的文件名
作用:读取所有文件,并将所有文件集合成为数组返回
*/
/*
fs.srat("./"+files[2],函数(err,stats){})
fs文件对象.stat("./"+files[2],函数(err,stats){})
①属于方法,有两个参数,第一个是文件的地址+返回的文件下标;用于锁定对象
②第二个参数是函,第一个形参对象是错误,第二个你当前stats的对象,很多文件的属性都是要通过这个对象点出来的
③用于查看对象
*/

五、第三方模块--包管理npm

1.作用

①快速安装包管理,管理文件,使得node和第三方模块文件有一个良好的文件系统 ②在迁移文件的时候也只需要将package.json文件带走,就可完成迁移,下载的包不需要带走

2.关于安装

①在命令行输入 npm init 初始化项目(可先建一个文件,将这一块地存储npm-project) 初始化会生成一个package.json的文件,主要用于存储所该项目的,作者以及使用第三方模块等信息; 在初始化过程中,可输入相关信息或者创建好之后将package.json进行更改;

②下载插件 使用 npm install 插件名 就可进行下载; 他会创建一个package-lock.json的文件,主要用来存储下载的插件地址,版本,路径等信息,迁移的时候,不需要将其带走;

所下载的插件会放在生成的node-module文件夹中

③npm下载路径的改变

使用命令 npm install --global cnpm 属于淘宝对npm的一个镜像:npm.taobao.org

3.npm的常规命令
npm -v  查看当前安装的版本号
npm -p  查看帮助显示npm中将具备哪些功能
npm init 初始化项目
npm install 第三方模块  :用于安装第三方模块
npm uninstall 第三方模块 :用于写在第三方模块
npm search 第三方模块 :用于搜索第三方模块
//npm install nodemon 自动开启服务器
//npm install nodemon -g 全局开启服务器
目前常用的插件:moment bootstrap jquery

六、自定义模块conmmonjs

1.nodejs的构成模块

nodejs由内置模块,自定义模块和第三方模块构成

nodejs关系图

2.关于自定模块

①一个文件就是一个模块,文件名就是模块名 ②模块的导出:导出模块使用module.exports=“模块内容”或者exports.a="模块内容" ③模块的引入:使用var 模块 = require(路径)

④模块的作用域:模块之间是有相互独立的作用域的,作用域中的变量是互不影响的

3.模块的加载顺序

①优先加载核心模块,核心模块是安装node环境就编译好的二进制代码,若核心模块中没有就会加载第三方模块 ②第三方模块会优先找node_module目录,如果没有找到pack.json文件,然后会找main文件,就去拿对应的属性文件; ③如果都没找到,那么就会脱离node_module文件就会向上一级去找,一直找到磁盘的根目录