系列文章目录
第二章:Nodejs模块化(npm与包、开发自己的包、模块加载机制)
第三章:Nodejs之Express(基本使用、Express路由)(一)
第四章:Nodejs之Express( Express 中间件、中间件的分类、自定义中间件)(二)
第五章:Nodejs之解决接口跨域问题
第六章:Nodejs操作Mysql数据库
第七章:Node之前后端身份认证(Session认证机制、JWT 认证机制)
第八章:Nodejs之egg基本使用(初始化项目、内置对象、egg路由、egg控制器)
第九章:Nodejs之egg基本使用(egg服务、egg-mysql、CSRF漏洞、egg-jwt、Swagger)
一、Node.js 简介
1.什么是Node.js
Node.js
是一个基于 Chrome V8 引擎的 JavaScript 运行环境
。
Node.js 的官网地址: https://nodejs.org/zh-cn/
2.Node.js 中的 JavaScript 运行环境
① 浏览器
是 JavaScript 的前端运行环境
。
② Node.js
是 JavaScript 的后端运行环境
。
③ Node.js
中无法调用
DOM 和 BOM 等浏览器内置 API
。
3. Node.js 可以做什么
Node.js 作为一个 JavaScript 的运行环境,仅仅提供了基础的功能和 API。
① 基于 Express 框架(http://www.expressjs.com.cn/),可以快速构建 Web 应用
② 基于 Electron 框架(https://electronjs.org/),可以构建跨平台的桌面应用
③ 基于 restify 框架(http://restify.com/),可以快速构建 API 接口项目
④ 读写和操作数据库、创建实用的命令行工具辅助前端开发、etc…
二、fs文件系统
fs
是 filesystem 的缩写,该模块提供本地⽂件的读写能⼒
,这个模块⼏乎对所有操作提供异步和同步两种操作⽅式,供开发者选择。
如果要在 JavaScript 代码中,使用 fs 模块来操作文件,则需要使用如下的方式先导入它:
const fs = require('fs')
1.读取指定文件中的内容
- fs.readFile() 异步读取文件
语法:
fs.readFile(path[, options], callback)
参数1:必选参数
,字符串,表示文件的路径
。
参数2:可选参数,表示以什么编码格式来读取文件,一般默认指定 utf8
。
参数3:必选参数
,回调函数,拿到读取失败和成功的结果
。回调函数中也有两个参数,第⼀个参数是发⽣错误时的错误对象
,第⼆个参数是代表⽂件内容的 Buffer 实例
。
代码示例:
// 1. 导入 fs 模块,来操作文件
const fs = require('fs')
// 2. 调用 fs.readFile() 方法读取文件
fs.readFile('./files/11.txt', 'utf8', function(err, data) {
// 2.1 打印失败的结果
// 如果读取成功,则 err 的值为 null
// 如果读取失败,则 err 的值为 错误对象,data 的值为 undefined
if(err){
return ;
}
// 2.2 打印成功的结果
console.log(data)
})
- readFileSync() 同步读取⽂件
返回⼀个Buffer实例。
语法:
fs.readFileSync(path[, options])
参数1:是⽂件路径。
参数2:可以是 ⼀个表示配置的对象
,也可以是⼀个表示⽂本⽂件编码的字符串。默认的配置对象是 { encoding: null, flag: ‘r’ } ,即⽂件编码默认为 null ,读取模式默认为 r (只读)。
代码示例:
let txt = fs.readFileSync("./files/1.txt", 'utf8');//将读取的内容赋值给txt
2.向指定的文件中写入内容
- fs.writeFile() 异步写⼊⽂件。
语法:
fs.writeFile(file, data[, options], callback)
参数1:必选参数
,需要指定一个文件路径的字符串,表示文件的存放路径
。
参数2:必选参数
,表示要写入的内容
。
参数3:可选参数,表示以什么格式写入文件内容,默认值是 utf8
。
参数4:必选参数
,文件写入完成后的回调函数
代码示例:
// 1. 导入 fs 文件系统模块
const fs = require('fs')
// 2. 调用 fs.writeFile() 方法,写入文件的内容
fs.writeFile('./files/3.txt', 'ok123', function(err) {
// 2.1 如果文件写入成功,则 err 的值等于 null
// 2.2 如果文件写入失败,则 err 的值等于一个 错误对象
if (err) {
return console.log('文件写入失败!' + err.message)
}
console.log('文件写入成功!')
})
- writeFileSync() 同步写⼊⽂件
语法:
fs.writeFileSync(file, data[, options])
参数1:必选参数
,需要指定一个文件路径的字符串,表示文件的存放路径
。
参数2:必选参数
,表示要写入的内容
。
参数3:可选参数,表示以什么格式写入文件内容,默认值是 utf8
。
代码示例:
let x = fs.writeFileSync("./files/3.txt", "这是通过writeFiles写入的")
3.扩展
在使用 fs 模块操作文件时,如果提供的操作路径是以 ./ 或 …/ 开头的相对路径时,很容易出现路径动态拼接错误的问题。
原因:可以直接提供一个完整的文件存放路径
解决方案:在使用 fs 模块操作文件时,直接提供完整的路径,不要提供 ./ 或 …/ 开头的相对路径,从而防止路径动态拼接的问题。
__dirname
表示当前文件所处的目录
代码示例:
fs.readFile(__dirname + '/files/1.txt', 'utf8', function(err, dataStr) {
if (err) {
return console.log('读取文件失败!' + err.message)
}
console.log('读取文件成功!' + dataStr)
})
三、 path 路径模块(常用)
path 模
块是 Node.js 官方提供的、用来处理路径的模块
。它提供了一系列的方法和属性,用来满足用户对路径的处理需求。
如果要在 JavaScript 代码中,使用 path 模块来处理路径,则需要使用如下的方式先导入它:
const path = require('path')
1. path.join() 路径拼接
语法:
path.join([...paths])
代码示例:
const path = require('path')
// 注意: ../ 会抵消前面的路径
const pathStr = path.join('/a', '/b/c', '../../', './d', 'e')
console.log(pathStr) // \a\b\d\e
2. path.basename() 获取路径中的文件名
语法:
path.basename(str[, ext]))
代码示例:
const path = require('path')
// 定义文件的存放路径
const fpath = '/a/b/c/index.html'
const fullName = path.basename(fpath)
console.log(fullName) //index.html
const nameWithoutExt = path.basename(fpath, '.html')
console.log(nameWithoutExt) //index
3. path.extname() 获取路径中的文件扩展名
语法:
path.basename(str[, ext]))
代码示例:
const path = require('path')
// 这是文件的存放路径
const fpath = '/a/b/c/index.html'
const fext = path.extname(fpath)
console.log(fext)//.html
4.path.dirname() 返回路径中⽂件夹的部分
语法:
path.dirname(path)
代码示例:
const path = require('path')
// 这是文件的存放路径
const fpath = '/a/b/c/index.html'
const fext = path.dirname(fpath)
console.log(fext)// /a/b/c/
四、url地址模块
提供解析url的⼯具,⼀个完整的href结构如下:
1 url.parse()
将url字符串地址转换为URL对象
const url = require('url')
let res = url.parse('http://admin1:123321@sub.briup.com:8080/user/login?page=1&pageSize=10#hash');
console.log(res);
运行结果:
2 url.searchParams()
获取表示⽹址查询参数的 URLSearchParams URLSearchParams 对象。此属性是只读的。
const myURL = new URL('https://example.com/some/path?
page=1&format=json');
console.log(myURL.searchParams); // URLSearchParams { 'page' =>
'1', 'format' => 'json' }
console.log(myURL.searchParams.get('page')); //1
console.log(myURL.searchParams.get('format'));//json
五、http 服务器模块
http 模块
是 Node.js 官方提供的、用来创建 web 服务器
的模块。通过 http 模块提供的 http.createServer() 方法,就能把一台普通的电脑变成一台 Web 服务器,从而对外提供 Web 资源服务。
如果要希望使用 http 模块创建 Web 服务器,则需要先导入它:
const http = require('http')
1.服务器相关概念
-
ip地址
IP 地址
就是互联网上每台计算机的唯一地址
,因此IP 地址具有唯一性
。
IP 地址的格式:通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d 都是 0~255 之间的十进制整数。例如:192.168.1.1 -
域名和域名服务器
-
IP 地址能够唯一地标记网络上的计算机,但不便于记忆,于是人们又发明了另一套字符型的地址方案,即所谓的
域名地址
。 -
IP地址和域名是一一对应的关系
,这份对应关系存放在一种叫做域名服务器(DNS)的电脑中。域名服务器
就是提供 IP 地址和域名之间的转换服务的服务器
。
-
-
端口
在一台电脑中,可以运行成百上千个 web 服务。每个 web 服务都对应一个唯一的端口号
。客户端发送过来的网络请求,通过端口号,可以被准确地交给对应的 web 服务进行处理。
注意:
① 每个端口号不能同时被多个 web 服务占用。
② 在实际应用中,URL 中的80 端口可以被省略
2.创建最基本的 web 服务器
步骤1 :导入 http 模块。
步骤2 :调用 http.createServer() 方法,即可快速创建一个 web 服务器实例。
步骤3:为服务器实例绑定 request 事件,即可监听客户端发送过来的网络请求。
步骤4:调用服务器实例的 .listen() 方法,即可启动当前的 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')
})
3. req 请求对象
req 是请求对象,包含了与客户端相关的数据和属性
req.url
是客户端请求的 URL 地址 ;req.method
是客户端请求的 method 类型;
代码示例:
const http = require('http')
const server = http.createServer()
// req 是请求对象,包含了与客户端相关的数据和属性
server.on('request', (req, res) => {
// req.url 是客户端请求的 URL 地址
const url = req.url
// req.method 是客户端请求的 method 类型
const method = req.method
const str = `url:${url},method: ${method}`
console.log(str)
})
server.listen(80, () => {
console.log('server running at http://127.0.0.1')
})
上述代码执行后,在浏览器中访问http://127.0.0.1/index.html,控制台输出:url: /index.html, method: GET
4. res 响应对象
res是响应对象,包含了与服务器相关的数据或属性
res.end()
将内容响应给客户端res.setHeader()
方法,设置 Content-Type 响应头,解决中文乱码的问题。
代码示例:
const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {
// 定义一个字符串,包含中文的内容
const str = `您请求的 URL 地址是 ${req.url},请求的 method 类型为 ${req.method}`
// 调用 res.setHeader() 方法,设置 Content-Type 响应头,解决中文乱码的问题
res.setHeader('Content-Type', 'text/html; charset=utf-8')
// res.end() 将内容响应给客户端
res.end(str)
})
server.listen(80, () => {
console.log('server running at http://127.0.0.1')
})