Node.js笔记-简介和安装,fs模块,path模块和http模块的使用
目录
node.js的简介和安装
简介
什么是node?
node.js是JavaScript的运行环境,将JS代码放到node环境中,就可以使用node.js提供的内置API,内置API可以对文件,数据库内容进行操作,还可以创建web服务器等许多功能的实现,这样,使用JS代码放到node环境中运行将可以做后端开发。
提到运行环境,node.js环境中不能操作DOM或BOM结构,因为node.js环境不提供操作DOM或BOM的内置API。我们在浏览器环境可以操作DOM或BOM结构是因为在浏览器环境中提供了操作DOM或BOM的内置API。
虽然在node.js环境中不能操作DOM或BOM结构,但是并不影响我们使用node.js的真实需求,我们使用node.js环境是做后端开发,是对数据库的数据操作和web服务器的创建及提供请求接口等功能。所以并不需要在node.js中操作DOM或BOM结构。
总结:使用javascript这个语言通过在node.js环境中执行做了后端的开发工作。
安装
node.js的安装非常简单,我们先到node.js官网。
我们下载LTS版本(稳定版),下载好后打开安装程序,无脑点击下一步即可。
检查是否安装成功
安装好了以后,我们打开命令行,输入node -v(查看版本),出现版本号就算安装成功。
在Node.js环境中打印"hello,node.js"
想要在node.js环境打印东西,那么我们就需要创建一个js文件,并且在node.js环境中运行。
// 在js文件中书写
console.log("hello,node.js");
命令行执行 node 文件名
node内置模块-fs模块
说明:fs模块是node内置的模块,可以看作是node内置的一类API。
fs模块作用:主要用来操作文件,模块中提供了一系列的方法和属性,用来对文件的各种操作。
模块的导入:
// js文件中导入模块方式
const fs = require("fs");
readFile()-读取指定文件内容
方法参数说明
//前提需要先导入模块
fs.readFile(path,[,options],callback)
path:必选,文件路径
[options]:可选,指定编码格式
callback:必选,回调函数,获取读取结果。
使用
需求,定义一个文件"hello.txt",使用方法fs.readFile()进行读取。
// 导入模块方式
const fs = require("fs");
fs.readFile("./hello.txt","utf-8",(err,datastr)=>{
if(err){return console.log("读取失败!")}
console.log("读取成功!数据为",datastr);
})
回调函数的参数说明:
1.当读取文件成功,err返回null,datastr返回文件数据。
2.当读取文件失败,err返回异常对象,datastr返回undefined
执行输出:
writeFile()-读取指定文件内容
方法参数说明:
fs.writeFile(file,data,[,options],callback)
file:需要写入的文件名
data:需要写入的数据(内容)
[options]:指定字符集
callbaack:回调函数
方法使用注意点:
1.此方法不能够自动创建目录。
2.向同一个文件操作,是覆盖操作,不是追加操作。
使用
需求:向文件myfile.txt中写入一些内容。
// 导入模块方式
const fs = require("fs");
// 定义写入数据
let str = `
hello,Tom
I am Jerry.
`
// 调用写入方法
fs.writeFile("./myfile.txt",str,"utf-8",(err)=>{
if(err){console.log("写入错误",err);}
console.log("写入成功!");
})
路径动态拼接的问题
问题描述:在使用fs模块操作文件时,如果填写路径时使用了相对路径的写法,如./或../形式,就会出现如下问题:
当前文件路径:D:\JavaScript\JSCode\BK3\Vue-Blog\2023-2-9\readFile().js
我们默认在\2023-2-9目录中执行node .\readFile().js是不会报错的。
但是如果我们将目录退一级,退到Vue-Blog目录
我们就需要执行 node './2023-2-9/readFile().js',看似没有问题,其实会报错:
因为它不会管我们自己写的路径前缀,他只会读取文件的名字,加上当前的的目录,在当前目录中查找当前是否存在此文件。
这其实有个简易的解决方案:我们使用绝对路径就可以避免,但是,使用绝对路径是比较繁琐的。
通过上述的说明,我们不想使用绝对路径的方式解决问题,那么我们就可以使用一个内置的属性:__dirname,此属性代表着我们当前的文件所处的目录。那么我们就可以进行路径书写优化:
node内置模块-path模块
作用:path模块是用来处理路径的模块。
说明:例如上方的案例,我们在读取文件时需要书写文件路径,我们是这样书写的:
__dirname + "/hello.txt"
通过手动拼接的方式书写,其实我们可以使用path模块中的方法,来对路径进行拼接操作。
模块的导入:
// 导入path模块
const path = require("path");
path.join()-将多个路径进行拼接
参数说明:
path.join([...options])
options:需要拼接的路径
使用
需求:将多个路径进行拼接。
// 导入path模块
const path = require("path");
let pathStr = path.join("a","b","c");
console.log(pathStr);
配合属性__dirname使用
// 导入path模块
const path = require("path");
// 导入模块方式
const fs = require("fs");
fs.readFile(path.join(__dirname,"hello.txt"),"utf8",(err,datastr)=>{
if(err){return console.log("读取失败!",err)}
console.log("读取成功!数据为",datastr);
})
path.basename()-获取路径中的文件名
参数说明:
path.basename(path,[,ext])
path:必选,需要解析的路径
[ext]:可选,文件名,如果填写相当于是删除掉了扩展名,只返回文件名。
使用
需求:给定一个路径,分别获取带后缀的文件名和不带后缀的文件名。
// 导入path模块
const path = require("path");
// 模拟路径
let pathStr = "a/b/c/hello.txt"
// 获取带后缀的文件名
console.log(path.basename(pathStr));// 输出:hello.txt
// 获取不带后缀的文件名
console.log(path.basename(pathStr,".txt"));// 输出:hello
node内置模块-http模块
作用:http 模块可以用来创建web服务器,对外提供web资源服务。
导入模块:
// 导入http内置模块
const http = require("http");
创建web服务器
// 1.导入http内置模块
const http = require("http");
// 2.调用http模块的方法createServer(),返回服务器实例
const server = http.createServer();
// 3.给服务器绑定请求事情,用于接收前端请求
server.on("request",(request,response)=>{
// 只要有请求访问此服务器,就会进入此方法进行处理
})
// 4.调用方法listen(),指定端口,开启服务器
server.listen(88,()=>{
console.log("服务器启动成功,运行在88端口!");
})
执行代码:
浏览器通过URL:http://127.0.0.1:88或者http://localhost:88访问服务器。
127.0.0.1为本地主机(localhost),88为指定的端口号,要是端口号为80,则不需要手动填写端口号:88,就能访问服务器,因为http协议默认访问80端口号。
上方执行后会处于一直加载的状态,因为我们服务器没有任何处理和响应给前端数据。
request请求对象和response响应对象
通过上方服务器的创建我们知道,当请求访问服务器时,会进入我们绑定的事件request的处理函数中,处理函数有两个参数,第一个是请求对象,第二个是响应对象。
请求对象request:可以访问客户端请求时的数据或属性。
响应对象respose:通过此对象可以向请求方返回数据。
使用
需求:获取请求时携带的参数和URL,并且给请求方响应一些提示信息。
// 导入http内置模块
const http = require("http");
// 调用http模块的方法createServer(),返回服务器实例
const server = http.createServer();
// 给服务器绑定请求事情,用于接收前端请求
server.on("request",(request,response)=>{
// 只要有请求访问此服务器,就会进入此方法进行处理
// 获取请求URI
let reqURL = request.url;
// 获取请求方式
let reqMethod = request.method;
console.log("本次访问URL为:",reqURL,"===,请求方式为:",reqMethod);
// 响应数据,并结束本次请求
response.end("感谢访问!");
})
// 调用方法listen(),指定端口,开启服务器
server.listen(88,()=>{
console.log("服务器启动成功,运行在88端口!");
})
终端输出:
访问页面展示:
解决中文乱码问题
在响应之前设置:
记得保存重启服务器
根据请求URL不同进行方法分发
上方定义的服务器是有些却缺陷的,我们使用server.on()给服务器绑定了请求事件,只要有请求就进入处理函数,这样不管什么请求,我们的处理方式都是相同的,这明显是不合理的,我们想要的是根据不同的访问路径,给予不同的处理方式。
如何做呢? 其实我们可以先获取请求的URI,对RUI进行判断后指定不同的处理。
// 导入http内置模块
const http = require("http");
// 调用http模块的方法createServer(),返回服务器实例
const server = http.createServer();
// 给服务器绑定请求事情,用于接收前端请求
server.on("request",(request,response)=>{
// 只要有请求访问此服务器,就会进入此方法进行处理
// 获取请求属性或数据
let reqURL = request.url;
// 指定默认响应的字符串
let resContent = "<h2>404 客户端错误 请检查!</h2>"
if(reqURL === "/" || reqURL === "/index.html"){
resContent = "<h2>首页</h2>"
} else if(reqURL === "/login.html"){
resContent = "<h2>登录页</h2>"
}
//设置响应头,指定字符集
response.setHeader("Content-type","text/html; charset=utf-8")
// 响应数据,并结束本次请求
response.end(resContent);
})
// 调用方法listen(),指定端口,开启服务器
server.listen(88,()=>{
console.log("服务器启动成功,运行在88端口!");
})
重启服务器,访问服务器
将URL映射为本地后输出
如上方式中,我们并没有返回真实的文件或数据,仅仅是返回一些字符串,但是在真实开发中,当用户访问如index.html时,我们返回的是存在服务器上真实的html资源。
需求:当有请求访问URL为hello.txt资源,我们就读取文件并将之响应到页面展示。
// 导入http内置模块
const fs= require("fs");
const http = require("http");
// 导入path模块
const path = require("path");
// 调用http模块的方法createServer(),返回服务器实例
const server = http.createServer();
// 3.给服务器绑定请求事情,用于接收前端请求
server.on("request",(request,response)=>{
// 只要有请求访问此服务器,就会进入此方法进行处理
// 获取请求属性或数据
let reqURL = request.url;
// 拼接URL(用于我们查找本地文件)
let localpath = path.join(__dirname,reqURL)
// 读取本地文件
fs.readFile(localpath,"utf-8",(err,dataStr)=>{
//设置响应头,指定字符集
response.setHeader("Content-type","text/html; charset=utf-8")
// 如果读取错误,给予提示
if(err){
response.end("<h2>路径错误或请求资源不存在!</h2>");
}
// 读取成功,将之返回
response.end(dataStr);
})
})
// 调用方法listen(),指定端口,开启服务器
server.listen(88,()=>{
console.log("服务器启动成功,运行在88端口!");
})
重启服务器,重新访问服务器