nodeJs简介
- 简单的说 Node.js 就是运行在服务端的 JavaScript。
- Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。
- Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境,基于 Google 的 V8 引擎,V8 引擎执行 Javascript 的速度非常快,性能非常好。
- Node.js 安装包及源码下载地址为:下载 | Node.js。
fs文件系统模块
fs模块是NodeJs官方提供的用来操作文件的内置模块,它提供了一系列的属性和方法,用来满足用户对文件操作的要求。
使用步骤:
1.导入模块
const fs=require('fs')
2.fs.readFile()
读取文件中的内容
fs.readFile(path(文件路径,必选参数,字符串),param(表示以什么编码格式读取文件utf8,可选参数,字符串),callback(回调函数,必选参数,通过回调函数拿到读取结果,函数))
示例:
fs.readFile('./read.txt', 'utf-8', function(err, res) {
// err是失败时返回的参数,读取成功则为null
// res是成功时返回的参数,读取失败则为undefine
console.log('err', err)
console.log('res', res)
})
3.fs.writeFile()
用来向指定的文件中写入内容
fs.writeFile(path(路径存放位置,必选),content(写入的内容,可选),param(编码格式,可选),callback(回调函数))
示例:
fs.writeFile(' /write.txt', '123', function(err) {
console.log(err) //如果文件写入成功则为null
if (err) {
return console.log('文件写入失败!' + err.message)
}
console.log('文件写入成功')
})
fs路径模块
1.文件路径的问题
在使用fs模块操作文件时,如果操作路径是以./或../开头的相对路径时,很容易出现路径动态拼接错误的问题。
原因:node命令执行时,会拼接文件node所在的目录路径
解决方案:
1.直接写入文件的完整路径
2.使用__dirname:表示当前文件所处的目录
示例:
// __dirname代表文件所处的目录
fs.readFile(__dirname + '/read.txt', 'utf-8', function(err, res) {
// err是失败时返回的参数,读取成功则为null
// res是成功时返回的参数,读取失败则为undefine
console.log('err', err)
console.log('res', res)
})
2.path路径模块
path模块是nodeJs官方提供的,用来处理路径的模块。
1.导入path模块
const path=require("path")
1.path.join()方法
用来将多个路径片段拼接成一个完整的路径字符串
语法格式:
path.join([...paths])//返回值为一个拼接好的字符串
示例:
const path = require("path")
const fs = require('fs')
console.log(path.join(__dirname + '/read.txt'))
fs.readFile(path.join(__dirname + '/read.txt'), 'utf-8', function(err, res) {
console.log('err', err)
console.log('res', res)
})
2.path.basename()方法
用来从路径片段中,将文件名解析出来
语法格式:
path.basename(path(字符串,表示一个路径,必选参数),ext(字符串,表示文件拓展名,可选参数)),返回文件名
示例:
const path = require('path')
const pathStr = '/a/b/c/index.html'
let str = path.basename(pathStr, '.html')
console.log(str) //输出index
console.log(path.basename(pathStr)) //输出index.html
3.path.extname()
可以获取路径中的拓展名部分,语法格式如下
path.extname(path)
示例:
console.log(path.extname(pathStr)) //输出.html
Express框架
Express是基于node.js平台快速,开放,极简的web开发框架。本质:就是一个npm上的第三方包,提供了快速创建web服务器的方法。
前端最常见的两种服务器:
web网站服务器:专门提供web网页资源的服务器。
API接口服务器:专门提供对的API接口服务器
1.安装
在创建的文件下打开命令窗口运行:npm i express@4.27.1
npm list express查看版本号
2.创建基本的服务器
1.导入express
2.创建web服务器
3.调用app.listen(端口号,启动成功后的回调函数),启动服务器
4.监听GET请求
通过app.get()方法,可以监听客服端的GET请求,具体语法如下:
// 4.监听get请求
// 参数1:客服端请求的Url地址
// 参数2:请求对应的处理函数
// req:请求对象(包含了请求相关的属性和方法)
// res:响应对象(包含了相应相关的属性和方法)
app.get('请求的url', function (req, res) {
// 处理函数
})
5.监听post请求
// 5.监听post请求通过app.post()方法
// 参数1:客服端请求的Url地址
// 参数2:请求对应的处理函数
// req:请求对象(包含了请求相关的属性和方法)
// res:响应对象(包含了相应相关的属性和方法)
app.post('请求的url', function (req, res) {
// 处理函数
})
6.通过res.send()方法把内容响应给客服端
// 6.使用res.send()方法把内容能够响应给客服端(必须写在启动服务器之前)
// 4.监听get请求
app.get('/user', (req, res) => {
res.send({ name: 'zs', age: 34, gender: '男' })
})
// 5.监听post请求通过app.post()
app.post('/user', function(req, res) {
//调用express提供的res.send()方法像客服端响应一个文本字符串,也可以响应json数据,功能强大
res.send('请求成功')
})
7.获取url中携带的参数
通过req.query对象,可以访问到客服端通过查询字符串的形式,发送到服务器的参数:
app.get('/user', (req, res) => {
// 7通过req.query对象,可以访问到客户端发送查询请求的字符串的参数
// 如:req.query默认是一个空对象
// 客户端使用?name:zs&age=20//这种查询方式发送到服务器的参数
// 可以通过req.query对象访问到,例如:req.query.name req.query.age
console.log(req.query)
res.send({ name: 'zs', age: 34, gender: '男' })
})
3.托管静态资源
1.express.static()
如:
app.use(express.static('./public'))
//使用app.use()方法
通过express.static()方法可以将public目录下的图片,css文件,javaScript文件对外公开访问,
注意:express在指定的静态目录中查找文件,并对外提供资源访问的路径。因此存放静态资源的目录名不会出在url中
访问资源时可以直接在域名后加/在家地址
另外想要托管多个静态资源目录,调用多次这个函数即可,如果存在多个同名文件则会返回包含该文件名的第一个目录下的文件,即按顺序下找到则返回,如果想要加上路径前缀区分。如下:
app.use('/public',express.static('./file'))
//此时前缀可以自己设定如:app.use('/abc',express.static('./file'))
2.nodemon
作用:在编写调试node.js项目的时候,如果修改了项目的代码,需要手动的关闭和启动,这时nodemon就会帮我监听项目文件的变动,nodemon会自动帮我们启动
安装:npm install -g nodemon
//此时需要用nodemon app.js 启动文件
4.express路由
在express中,路由是客服端请求与服务器处理函数之间的映射关系。
express路由分三部分,分别是请求类型(get,post,put,delete等),请求url地址,处理函数,格式如下:
app.method(path,callback)
路由的匹配过程:每当一个请求到达服务器之后,必须先经过路由的匹配,只有匹配成功之后才会调用对应的处理函数,在匹配时,会按照路由的顺序进行匹配,请求类型和请求url同时匹配成功,则Express会将这次请求转个对应的函数进行处理。但是路由挂载太多太繁琐,不利于维护。
const express = require('express')
const app = express()
app.use(express.static('./public')) //此时的路径不会出现在访问路径中
//访问资源时可以直接在域名后加/在家地址
// 另外想要托管多个静态资源目录,调用多次这个函数即可,如果存在多个同名文件
// 则会返回包含该文件名的第一个目录下的文件, 即按顺序下找到则返回
// 如果希望在托管路径之前,挂在路径前缀,如下
// app.use('/abc', express.static('./file'))
app.use('/files', express.static('./file'))
// 挂载路由
app.get('/', (req, res) => { res.send('hello world') })
app.listen(1314, () => {
console.log('express running at http://127.0.0.1:1314')
})
2.路由模块化
为了方便队友的管理,不建议将路由直接挂载到app实列上,而是推荐将路由抽离为单独的模块,方便对路由进行模块化处理。
步骤如下:
1.创建有模块对应的.js文件
2.调用express.Router()函数创建路由对象
3.向路由对象挂载具体的路由
4.使用module.exports向外共享路由对象
5.使用app.use()函数注册路由模块
注意:app.use()方法就是用来注册全局中间件0000
var express = require('express')//导入express模块
var router = express.Router()//创建express路由实例
//挂载路由请求
router.get('/user/list', (req, res) => {
res.send('get user list')
})
router.post('/user/add', (req, res) => {
res.send(' add new list')
})
//对外共享路由模块
module.exports = router
开启服务的js文件
const express = require('express')
const app = express()
const router = require('./04路由的模块化.js') //导入路由模块
app.use(router) //注册全局路由
app.listen(8080, function(req, res) {
console.log('http://127.0.0.1:8080')
})
6.为路由添加前缀
const router = require('./04路由的模块化.js') //导入路由模块
//注册全局路由
// 为路由模块添加前缀
app.use('/api',router)
五.中间件
1.express中间件,本质上就是一个function处理函数,express中间件的格式如下:
中间形参列表中必须包含next函数,而路由只包含req和res函数
application.get('/', function (req, res, next) {
//此时的function就是一个中间件
})
2.next函数的作用
是实现多个中间件连续调用的关键,他把流转关系转交给下一个中间件或者路