Node.js笔记-简介和安装,fs模块,path模块和http模块的使用

目录

node.js的简介和安装 

简介

安装

 在Node.js环境中打印"hello,node.js"

 node内置模块-fs模块

readFile()-读取指定文件内容

 writeFile()-读取指定文件内容

路径动态拼接的问题

node内置模块-path模块

path.join()-将多个路径进行拼接

 path.basename()-获取路径中的文件名

node内置模块-http模块

创建web服务器

request请求对象和response响应对象

 根据请求URL不同进行方法分发

将URL映射为本地后输出


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端口!");
})

重启服务器,重新访问服务器