目录
初识Node.js
Node.js 是一个基于ChromeV8 引擎的JavaScript 运行环境。Node.js的官网地址:Node.js>
①浏览器是JavaScript的前端运行环境。
②Node.js是JavaScript的后端运行环境。
③Node.js 中无法调用 DOM和BOM等浏览器内置 API。
在Node.js环境中执行JavaScript代码
①win + R 输入 cmd 命令,cd/d 目标路径。然后输入node 要执行的js文件
②直接在保存有要运行的js文件的文件夹的文件路径栏中输入cmd指令,然后输入node 要执行的js文件
③在保存有要运行的js文件的文件夹的空白处右键选择在终端中打开,然后输入node 要执行的js文件
终端中的快捷键
①使用 ↑键,可以快速定位到上一次执行的命令
②使用 tab键,能够快速补全路径(比如我输入 node 1 然后直接按tab键他就会自动帮我补齐文件名和后缀名)
③使用 esc键,能够快速清空当前已输入的命令(清空当前行输入的命令)
④输入 cls命令,可以清空终端
fs文件系统模块
fs模块是Node.js官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求
fs.readFile()方法,用来读取指定文件中的内容
fs.writeFile()方法,用来向指定的文件中写入内容
如果要在 JavaScript代码中,使用fs模块来操作文件,则需要使用如下的方式先导入它
const fs = require('fs')
fs.readFile()
读取指定文件中的内容
使用fs.readFile()方法,可以读取指定文件中的内容,语法格式如下:
fs.readFile(path[,options],callback)
/*参数1:必选参数,字符串,表示文件的路径。
参数2:可选参数,表示以什么编码格式来读取文件。
参数3:必选参数,文件读取完成后,通过回调函数拿到读取的结果。*/
以utf8的编码格式,读取指定文件的内容,并打印err和dataStr的值:
//1、导入fs模块来操作文件
const fs = require('fs')
//2、调用fs.readFile()方法读取文件
fs.readFile('./files/1.txt', 'utf8', function (err, dataStr) {
/* 若读取成功err的值为null;dataStr是文件内容
若读取失败则err的值为错误对象,dataStr的值为undefined */
//打印失败的结果
console.log(err)
console.log('---------')
//打印成功的结果
console.log(dataStr)
})
判断文件是否读取成功
可以判断err对象是否为null,从而知晓文件读取的结果:
const fs = require('fs')
fs.readFile('./files/1.txt', 'utf8', function (err, dataStr) {
if (err) {
console.log('获取文件失败。错误提示:' + err)
} else {
console.log('获取文件成功。内容是:' + dataStr)
}
}) //如果文件读取成功 则err的值为null,在if(err){...}else{...}语句中,null为假,执行else中的语句,否则执行if中的语句
fs.writeFile()
向指定的文件中写入内容
使用fs.writeFile()方法,可以向指定的文件中写入内容,语法格式如下:
fs.writeFile(file,data[,options],callback)
/*参数1:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径。
参数2:必选参数,表示要写入的内容。
参数3:可选参数,表示以什么格式写入文件内容,默认值是 utf8。
参数4:必选参数,文件写入完成后的回调函数。*/
向指定的文件路径中,写入文件内容:
const fs = require('fs')
fs.writeFile('./files/2.txt', 'hello', function (err) {
/* 若文件写入成功则err的值为null(如果在指定路径中没有这个文件则会自动生成创建这个文件并写入内容)
若文件写入失败则err的值是一个错误对象 */
console.log(err)
}) // 新写入的文件内容会覆盖掉原有的内容
判断文件是否写入成功
可以判断err对象是否为null,从而知晓文件写入的结果:
const fs = require('fs')
fs.writeFile('./files/2.txt', 'hello', function (err) {
/* 判断文件是否写入成功 */
if (err) {
console.log('文件写入失败。错误提示:' + err);
} else {
console.log('文件写入成功');
}
})
路径动态拼接问题
__dirname表示当前文件所处的目录
const fs = require('fs')
fs.readFile(__dirname + '/files/格式化成绩.txt', 'utf8', function (err, dataStr) {
if (err) {
console.log('文件读取失败。' + err)
} else {
console.log('文件读取成功。内容如下:')
console.log(dataStr)
}
})
path路径模块
path模块是Node.js官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理需求
path.join()方法,用来将多个路径片段拼接成一个完整的路径字符串
path.basename()方法,用来从路径字符串中,将文件名解析出来
如果要在JavaScript代码中,使用path模块来处理路径,则需要使用如下的方式先导入它:
const path = require('path')
path.join()
使用path.join()方法,可以把多个路径片段拼接为完整的路径字符串,语法格式如下:
path.join([...paths])
/*...paths <string> 路径片段的序列
返回值: <string>*/
使用path.join()方法,可以把多个路径片段拼接为完整的路径字符串:
const path = require('path')
let pathStr = path.join('/a', '/b', '../', '/c/d/e', '../../', '/f')
console.log(pathStr) // \a\c\f
/* 如果遇到../则表示返回上一级 */
今后凡是涉及到路径拼接的操作,都要使用path.join()方法进行处理
const fs = require('fs')
const path = require('path')
fs.readFile(path.join(__dirname, './files/格式化成绩.txt'), 'utf8', function (err, dataStr) {
if (err) {
console.log('获取文件失败' + err)
} else {
console.log('获取文件成功。文件内容如下:')
console.log(dataStr)
}
})
path.basename()
使用 path.basename()方法,可以获取路径中的最后一部分,经常通过这个方法获取路径中的文件名,语法格式如下
path.basename(path[,ext])
/*path <string> 必选参数,表示一个路径的字符串
ext <string> 可选参数,表示文件扩展名
返回: <string> 表示路径中的最后一部分*/
当我们这里不带文件扩展名参数时,他返回的是一个带后缀名的文件名称
const path = require('path')
//我们假设一个文件的存放路径
let fpath = '/a/b/c/index.html'
let fullname = path.basename(fpath)
console.log(fullname) // index.html
当我们携带文件扩展名作为第二个参数时,返回的是一个不带扩展名的文件名称
let nameWithoutExt = path.basename(fpath, '.html')
console.log(nameWithoutExt) // index
path.extname()
使用 path.extname()方法,可以获取路径中的扩展名部分,语法格式如下
path.extname(path)
/*path <string>必选参数,表示一个路径的字符串
返回: <string> 返回得到的扩展名字符串*/
使用path.extname()方法,可以获取路径中的扩展名部分:
const path = require('path')
//我们假设一个文件的存放路径
let fpath = '/a/b/c/index.html'
let fext = path.extname(fpath)
console.log(fext) // .html
http模块
http 模块是Node.js官方提供的、用来创建 web 服务器的模块。通过http模块提供的http.createServer() 方法,就能方便的把一台普通的电脑,变成一台Web服务器,从而对外提供Web资源服务。
服务器相关概念
IP地址
IP地址就是互联网上每台计算机的唯一地址,因此IP地址具有唯一性
域名和域名服务器
IP地址和域名是一一对应的关系,这份对应关系存放在一种叫做域名服务器(DNS)的电脑中。域名服务器就是提供IP地址和域名之间的转换服务的服务器。
创建最基本的web服务器
//1.导入http模块
const http = require('http')
//2.创建web服务器实例
const server = http.createServer()
//3.为服务器实例绑定request事件,监听客户端的请求
server.on('request', function (req, res) {
console.log('Someone visit our web Server')
})
//4.启动服务器
server.listen(8080, function () {
console.log('Server running at http://127.0.0.1:8080')
})
//在终端中 Ctrl + C 即可关闭服务器
当在终端中执行此js文件后,成功启动服务器后会在终端中打印出“Server running at http://127.0.0.1:8080”,当我们复制这个网址去浏览器访问时,成功访问到服务器则会在终端中打印“Someone visit our web Server”
req请求对象
只要服务器收到了客户端的请求,就会调用server.on()为服务器绑定的request事件处理函数
如果想在事件处理函数中,访问与客户端相关的数据和属性,可以使用如下方式:
const http = require('http')
const server = http.createServer()
server.on('request', (req) => {
// req 是请求对象,它包含了与客户端相关的数据和属性
//req.url是客户端请求的URL地址,返回的url地址是从端口号后面开始的,如下图中的/index.html
const url = req.url
//req.method是客户端请求的类型
const method = req.method
let str = `Your request url is ${url} , and request type is ${method}`
console.log(str)
})
server.listen(8081, () => {
console.log('server running at http://127.0.0.1:8081')
})
服务器被访问
res响应对象
res是响应对象,它包含了服务器的相关属性和数据
const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {
const str = `你请求的URL地址是${req.url} , 请求方式是${req.method}`
//当调用res.end()方法向客户端发送中文内容时会出现乱码问题,此时,需要手动设置内容的编码格式
res.setHeader('Content-Type', 'text/html; charset=utf-8')
//向客户端发送指定的内容,并结束这次请求的处理结果
res.end(str)
})
server.listen(8081, () => {
console.log('server running at http://127.0.0.1:8081')
})
根据不同的url响应不同的html内容
const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {
//1.获取请求的URL地址
const url = req.url
//2.设置默认响应内容为404 NOT found
let response = `<h1>404 NOT found</h1>`
//3.1判断用户请求的是否为 / 或 /index.html 首页
if (url === '/' || url === '/index.html') {
response = `<h1>首页</h1>`
} else if (url === '/about.html') {
response = `<h1>其他</h1>`
} //3.2判断用户请求的是否为 /about.html 页面
//4.设置 Content-Type 响应头,防止中文乱码
res.setHeader('Content-Type', 'text/html; charset=utf-8')
//5.res.end()把内容响应给客户端
res.end(response)
})
server.listen(8080, () => {
console.log('server running at http://127.0.0.1:8080')
})
综合案例
在本地文件夹中有一个clock文件夹,里面存放了index.html,index.css和index.js。创建一个服务器,在本地中以客户端形式在浏览器中去访问这个页面
// 1.1 导入 http 模块
const http = require('http')
// 1.2 导入 fs 模块
const fs = require('fs')
// 1.3 导入 path 模块
const path = require('path')
// 2.1 创建 web 服务器
const server = http.createServer()
// 2.2 监听 web 服务器的 request 事件
server.on('request', (req, res) => {
// 3.1 获取到客户端请求的 URL 地址
// /clock/index.html
const url = req.url
// 3.2 把请求的 URL 地址映射为具体文件的存放路径
// const fpath = path.join(__dirname, url)
// 5.1 预定义一个空白的文件存放路径
let fpath = ''
if (url === '/') {
fpath = path.join(__dirname, './clock/index.html')
} else {
// /index.html
fpath = path.join(__dirname, '/clock', url)
}
// 4.1 根据“映射”过来的文件路径读取文件的内容
fs.readFile(fpath, 'utf8', (err, dataStr) => {
// 4.2 读取失败,向客户端响应固定的“错误消息”
if (err) return res.end('404 Not found.')
// 4.3 读取成功,将读取成功的内容,响应给客户端
res.end(dataStr)
})
})
// 2.3 启动服务器
server.listen(8080, () => {
console.log('server running at http://127.0.0.1::8080')
})