Node笔记
一、node概述
1、Chrome 浏览器的v8引擎可以解析JavaScript代码
2、Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
浏览器是 JavaScript 的前端运行环境。
Node.js 是 JavaScript 的后端运行环境。
Node.js 中无法调用 DOM 和 BOM 等浏览器内置 API
3、Node.js 的学习路径:
JavaScript 基础语法 + Node.js 内置 API 模块(fs、path、http等)+ 第三方 API 模块(express、mysql 等)
二、 终端中的快捷键
使用 ↑ 键,可以快速定位到上一次执行的命令
使用 tab 键,能够快速补全路径
使用 esc 键,能够快速清空当前已输入的命令
输入 cls 命令,可以清空终端
三、 fs 文件系统模块
1、fs 模块是 Node.js 官方提供的、用来操作文件的模块。使用 fs 模块来操作文件,需要先导入
constfs =require('fs')
2、读取指定文件中的内容
// 导入fs模块
constfs=require('fs')
// 读取内容
fs.readFile('./files/11.txt', 'utf8', function(err, dataStr) {
if (err) {
returnconsole.log('读取文件失败!'+err.message)
}
console.log('读取文件成功!'+dataStr)
})
参数1:必选参数,字符串,表示文件的路径。
参数2:可选参数,表示以什么编码格式来读取文件。
参数3:必选参数,文件读取完成后,通过回调函数拿到读取的结果。
3、向指定的文件中写入内容
// 导入fs模块
constfs=require('fs')
// 写入内容
fs.writeFile('./files/2.txt', 'Hello Node.js', function(err) {
if (err) {
returnconsole.log('文件写入失败!'+err.message)
}
console.log('文件写入成功!')
})
参数1:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径。
参数2:必选参数,表示要写入的内容。
参数3:可选参数,表示以什么格式写入文件内容,默认值是 utf8。
参数4:必选参数,文件写入完成后的回调函数。
四、path 路径模块
1、把多个路径片段拼接为完整的路径字符串
// 导入path模块
constpath=require('path')
pathStr=path.join('/a', '/b/c', '../../', './d', 'e')
console.log(pathStr) // \a\b\d\e
...paths <string> 路径片段的序列
返回值: <string>
2、获取路径中的文件名
constpath=require('path')
// 定义文件的存放路径
constfpath='/a/b/c/index.html'
constfullName=path.basename(fpath)
console.log(fullName)
constnameWithoutExt=path.basename(fpath, '.html')
console.log(nameWithoutExt)
path <string> 必选参数,表示一个路径的字符串
ext <string> 可选参数,表示文件扩展名
返回: <string> 表示路径中的最后一部分
3、获取路径中的扩展名
constpath=require('path')
// 这是文件的存放路径
constfpath='/a/b/c/index.html'
constfext=path.extname(fpath)
console.log(fext)
path <string>必选参数,表示一个路径的字符串
返回: <string> 返回得到的扩展名字符串
五、http 模块
1、通过 http 模块提供的 http.createServer() 方法,就能方便的把一台普通的电脑,变成一台 Web 服务器,从而对外提供 Web 资源服务。
六、Express
1、概述
Express 是基于 Node.js 平台,快速、开放、极简的 Web 开发框架。
Express是node.js中内置模块http的升级版
使用 Express,我们可以方便、快速的创建 Web 网站的服务器或 API 接口的服务器。
Express 的中文官网: http://www.expressjs.com.cn/
2、基本用法
// 1. 导入 express
constexpress=require('express')
// 2. 创建 web 服务器
constapp=express()
// 4. 监听客户端的 GET 和 POST 请求,并向客户端响应具体的内容
app.get('/user', (req, res) => {
// 调用 express 提供的 res.send() 方法,向客户端响应一个 JSON 对象
res.send({ name: 'zs', age: 20, gender: '男' })
})
app.post('/user', (req, res) => {
// 调用 express 提供的 res.send() 方法,向客户端响应一个 文本字符串
res.send('请求成功')
})
app.get('/', (req, res) => {
// 通过 req.query 可以获取到客户端发送过来的 查询参数
// 注意:默认情况下,req.query 是一个空对象
console.log(req.query)
res.send(req.query)
})
// 注意:这里的 :id 是一个动态的参数
app.get('/user/:ids/:username', (req, res) => {
// req.params 是动态匹配到的 URL 参数,默认也是一个空对象
console.log(req.params)
res.send(req.params)
})
// 3. 启动 web 服务器
app.listen(80, () => {
console.log('express server running at http://127.0.0.1')
})
3、托管静态资源 express.static()
constexpress=require('express')
constapp=express()
// 在这里,调用 express.static() 方法,快速的对外提供静态资源
// 挂载路径前缀,在访问的时候,需要在路径前面加上/files
app.use('/files', express.static('./files'))
// 不挂载路径前缀
app.use(express.static('./clock'))
app.listen(80, () => {
console.log('express server running at http://127.0.0.1')
})
4、nodemon
能够监听项目文件的变动,当代码被修改后,nodemon 会自动帮我们重启项目
// 安装nodemon
npmi-gnodemon
5、Express 路由
5.1、概述
在 Express 中,路由指的是客户端的请求与服务器处理函数之间的映射关系。
Express 中的路由分 3 部分组成,分别是请求的类型、请求的 URL 地址、处理函数
5.2、用法
// 一、简单用法
constexpress=require('express')
constapp=express()
// 挂载路由
app.get('/', (req, res) => {
res.send('hello world.')
})
app.post('/', (req, res) => {
res.send('Post Request.')
})
app.listen(80, () => {
console.log('http://127.0.0.1')
})
// 二、创建路由模块
// 这是路由模块
// 1. 导入 express
constexpress=require('express')
// 2. 创建路由对象
constrouter=express.Router()
// 3. 挂载具体的路由
router.get('/user/list', (req, res) => {
res.send('Get user list.')
})
router.post('/user/add', (req, res) => {
res.send('Add new user.')
})
// 4. 向外导出路由对象
module.exports=router
constexpress=require('express')
constapp=express()
// 1. 导入路由模块
constrouter=require('./03.router')
// 2. 注册路由模块,添加统一的访问前缀/api
app.use('/api', router) // 注意: app.use() 函数的作用,就是来注册全局中间件
app.listen(80, () => {
console.log('http://127.0.0.1')
})
5.3、路由的匹配过程
按照定义的先后顺序进行匹配
请求类型和请求的URL同时匹配成功,才会调用对应的处理函数
6、Express 中间件
6.1、概述
特指业务流程的中间处理环节。
当一个请求到达 Express 的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理。
Express 的中间件,本质上就是一个 function 处理函数
中间件函数的形参列表中,必须包含 next 参数。而路由处理函数中只包含 req 和 res。
next 函数是实现多个中间件连续调用的关键,它表示把流转关系转交给下一个中间件或路由。
6.2、全局生效的中间件
//调用 app.use()
app.use((req, res, next) => {
console.log('调用了第1个全局中间件')
next()
})
6.3、 局部生效的中间件
// 1. 定义中间件函数
constmw1= (req, res, next) => {
console.log('调用了局部生效的中间件')
next()
}
// 2. 创建路由
app.get('/', mw1, (req, res) => {
res.send('Home page.')
})
6.4、使用中间件的注意事项
一定要在路由之前注册中间件
客户端发送过来的请求,可以连续调用多个中间件进行处理
执行完中间件的业务代码之后,不要忘记调用 next() 函数
为了防止代码逻辑混乱,调用 next() 函数后不要再写额外的代码
连续调用多个中间件时,多个中间件之间,共享 req 和 res 对象
6.5、中间件分类
应用级别的中间件
// 通过 app.use() 或 app.METHOD() 函数,绑定到 app 实例上的中间件
路由级别的中间件
// 绑定到 express.Router() 实例上的中间件
错误级别的中间件
// 错误级别的中间件,必须注册在所有路由之后
// 2. 定义错误级别的中间件,捕获整个项目的异常错误,从而防止程序的崩溃
app.use((err, req, res, next) => {
console.log('发生了错误!'+err.message)
res.send('Error:'+err.message)
})
Express 内置的中间件
// 解析表单中的 JSON 格式的数据
app.use(express.json())
// 解析表单中的 url-encoded 格式的数据
app.use(express.urlencoded({ extended: false }))
// 快速托管静态资源
app.use(express.static())
第三方的中间件
// 1. 导入解析表单数据的中间件 body-parser
constparser=require('body-parser')
// 2. 使用 app.use() 注册中间件
app.use(parser.urlencoded({ extended: false })) // app.use(express.urlencoded({ extended: false }))