一、Node.js简介
浏览器中JavaScript在浏览器中的运行环境(代码正常运行需要的环境),
Node.js后端的运行环境,通过Node.js可以实现用JavaScript后端开发
Node.js是一个基于Chrome V8引擎的JavaScript运行环境
二、fs文件系统模块
读取指定文件中的内容
fs.readFile()语法格式: fs.readFile(path[,options],callback)
代码:
const { log } = require('console')
//引入fs模块进行文件操作
const fs = require('fs')
// 1.参数路径
// 2.输出格式
// 3.会点函数,返回失败和成功的结果
fs.readFile('./readFile/read.text','utf8',(err,dataStr)=>{
log(err)
log('======')
console.log(dataStr);
})
代码展示:
const { log } = require('console')
//引入fs模块进行文件操作
const fs = require('fs')
// 1.写入文件路径
// 2.写入内容
// 3.编码格式,默认是utf8,可以省略
// 4.回调函数
fs.writeFile('./readFile/read.text','55566665','utf8',(err,data)=>{
log(err)
console.log(data);
})
绝对路径和相对路径,代码运行时会以执行node命令时所在的目录,动态的拼接出被操作文件的完整路径。
解决fs模块路径拼接的问题
三、path模块
../ 会抵消一层路径
获取文件名
移出文件扩展名
四、HTTP模块
代码:
//引入http请求
const http=require('http')
//创建服务
const server = http.createServer()
//监听请求
server.on('request',(req,res)=>{
console.log('触发了请求');
})
//启动服务
server.listen(8080,()=>{
console.log('启动服务');
})
res.setHeader('Content-Type','text/html; charset=utf-8')
五、模块化
module.exports导出 require引入
module.exports默认是空对象
exports指向module.exports对象
时刻谨记,使用require()模块时,得到的永远是module.export指向的对象
六、包管理
指定下载包的版本 npm i 包@版本号
npm uninstall 包名称 卸载包
-D 将包记录到dev节点中,仅开发使用
i5ting_toc
i5ting_toc -f 要转换的md文件路径 -o
require()引入包使用
...展开运算符
npm包配置项
{
"name": "xc-tools",
"version": "1.0.0",
"main": "index.js",
"description": "初次提交,用于提交测试,输入什么返回什么",
"keywords": [
"xc",
"tools"
],
"license": "ISC"
}
七、模块加载机制
八、express模块
//1.导入express
const express = require('express')
//2.创建web服务器
const app=express()
//3.调用listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80,()=>{
console.log('服务启动成功');
})
监听客户端请求,实现数据传递
//1.导入express
const express = require('express')
//2.创建web服务器
const app=express()
//4.监听客户端请求
//监听get请求
app.get('/user',(req,res)=>{
res.send({name:'zs',age:20})
})
//监听post请求
app.post('/user',(req,res)=>{
res.send('请求成功')
})
//3.调用listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80,()=>{
console.log('服务启动成功');
})
获取url上面的query参数
//1.导入express
const express = require('express')
//2.创建web服务器
const app=express()
//4.监听客户端请求
//监听get请求
app.get('/user',(req,res)=>{
res.send({name:'zs',age:20})
})
//监听post请求
app.post('/user',(req,res)=>{
res.send('请求成功')
})
//5.通过req.query获取客户端发送过来的查询参数
app.get('/',(req,res)=>{
//注意在默认情况下,req.query是一个空对象
console.log(req.query);
})
//3.调用listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80,()=>{
console.log('服务启动成功');
})//1.导入express
const express = require('express')
//2.创建web服务器
const app=express()
//4.监听客户端请求
//监听get请求
app.get('/user',(req,res)=>{
res.send({name:'zs',age:20})
})
//监听post请求
app.post('/user',(req,res)=>{
res.send('请求成功')
})
//5.通过req.query获取客户端发送过来的查询参数
app.get('/',(req,res)=>{
//注意在默认情况下,req.query是一个空对象
console.log(req.query);
})
//3.调用listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80,()=>{
console.log('服务启动成功');
})
通过req.params获取:匹配到的动态参数(params参数) /use:id/:name传递两个参数也是可以的
//1.导入express
const express = require('express')
//2.创建web服务器
const app=express()
//4.监听客户端请求
//监听get请求
app.get('/user',(req,res)=>{
res.send({name:'zs',age:20})
})
//监听post请求
app.post('/user',(req,res)=>{
res.send('请求成功')
})
//5.通过req.query获取客户端发送过来的查询参数
app.get('/',(req,res)=>{
//注意在默认情况下,req.query是一个空对象
console.log(req.query);
})
//6.获取:id动态参数
app.get('/user/:id',(req,res)=>{
console.log(req.params);
res.send(req.params)
})
//3.调用listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80,()=>{
console.log('服务启动成功');
})
express.static()托管静态资源
//7.通过express.static()托管静态资源
app.use(express.static('./无用'))
nodemon实现自动重启项目的效果,nodemon 文件名
express路由
创建路由模块
//这是路由模块
//1.导入express
const express = require('express')
//2.创建路由对象
const router = express.Router()
//3.挂载具体的路由
router.get('user/list',(req,res)=>{
res.send('调用了list接口')
})
//4.导出路由对象
module.exports=router
注册路由模块
const express = require('express')
const app=express()
const router=require('./路由模块')
app.use(router)
app.listen('80',()=>{
console.log('服务启动成功');
})
app.use()函数的作用,就是用来注册全局中间件
app.use('/api',routre) 给路由添加前缀
九、express中间件
定义中间件函数
const express = require('express')
const app = express()
//定义一个最简单的中间件函数
const mv = (req,res,next)=>{
console.log('这是最简单的中间件');
//把流转关系,转交给下一个中间件或路由
next()
}
app.listen(80,()=>{
console.log('服务启动成功');
})
全局express中间件
const express = require('express')
const app = express()
//定义一个最简单的中间件函数
const mv = (req,res,next)=>{
console.log('这是最简单的中间件');
//把流转关系,转交给下一个中间件或路由
next()
}
//将mv注册为全局生效的中间件
app.use(mv)
app.listen(80,()=>{
console.log('服务启动成功');
})
全局中间件的简写形式
const express = require('express')
const app = express()
//定义全局中间件的简写形式
app.use((req,res,next)=>{
console.log('这是最简单的中间件');
//把流转关系,转交给下一个中间件或路由
next()
})
app.listen(80,()=>{
console.log('服务启动成功');
})
中间件的作用
const express = require('express')
const app = express()
//定义全局中间件的简写形式
app.use((req,res,next)=>{
// 获取到请求的时间
const time = Date.now()
//为req对象,挂载自定义属性,从而把事件共享给后面所有的路由
req.startTime=time
next()
})
app.get('/',(req,res)=>{
res.send('获取到请求的时间:'+req.startTime)
})
app.listen(80,()=>{
console.log('服务启动成功');
})
定义多个全局中间件,连续定义,依次执行
局部中间件的使用
const express= require('express')
const app = express()
const mv=(req,res,next)=>{
console.log('我是局部中间件');
next()
}
//第二个参数传入对应的局部中间件
app.get('/',mv,(req,res,)=>{
})
app.listen(80,()=>{
console.log('服务器启动成功');
})
数组形式或者依次添加
依次执行,局部中间件需要放到路由前面
中间件的5大分类
应用级别的中间件
错误级别的中间件要放在所有路由之后
const express= require('express')
const app = express()
//演示错误中间件
app.get('/',(req,res)=>{
//人为的制造错误
throw new Error('服务器内部发生错误')
res.send('5555')
})
//定义错误级别的中间件,捕获整个项目的异常错误,从而防止程序的崩溃。
app.use((err,req,res,next)=>{
res.send('错误信息:'+err.message)
})
app.listen(80,()=>{
console.log('服务器启动成功');
})
express.json解析body参数
const express= require('express')
const app = express()
//注意:除了错误级别的中间件,其他的中间件,必须在路由之前配置
//通过express.json() 这个中间件,解析表单中的JSON格式的数据
app.use(express.json())
app.post('/',(req,res)=>{
//在服务端可以通过req.body来接收客户端发来的请求体
//默认情况下,如果不配置解析表单数据的中间件,则req.body默认等于undefined
// console.log(req.body);//undefined
res.send(req.body)
})
app.listen(80,()=>{
console.log('服务器启动成功');
})
express.urlencoded()解析urlencoded格式的参数值
const express= require('express')
const app = express()
//注意:除了错误级别的中间件,其他的中间件,必须在路由之前配置
//通过express.json() 这个中间件,解析表单中的JSON格式的数据
app.use(express.json())
app.use(express.urlencoded({extended:false}))
app.post('/',(req,res)=>{
//在服务端可以通过req.body来接收客户端发来的请求体
//默认情况下,如果不配置解析表单数据的中间件,则req.body默认等于undefined
// console.log(req.body);//undefined
res.send(req.body)
})
app.post('/book',(req,res)=>{
//在服务器端,可以通过req.body来获取JSON格式的表单数据和url-encoded格式的数据
console.log(req.body);
res.send('111')
})
app.listen(80,()=>{
console.log('服务器启动成功');
})
自定义中间件
const express = require('express')
const qs= require('querystring')
const app = express()
//自定义解析表单的中间件
app.use((req, res, next) => {
//定义中间件具体业务逻辑
//1.定义一个str字符串,专门用来存储客户端发送过来的请求体数据
let str = ''
//2.监听req的data事件
req.on('data', (chunk) => {
str += chunk
})
//3.监听req的end事件
req.on('end',()=>{
//打印完整的请求数据
console.log(str);
//把字符串格式的请求数据,解析成对象格式
const body = qs.parse(str)
// console.log(body);
req.body=body
next()
})
})
app.post('/book',(req,res)=>{
res.send(req.body)
})
app.listen(80, () => {
console.log('服务器启动成功');
})
使用express开发接口
进行接口的开发
服务器文件
const express = require('express')
//引入路由模块
const apiRouter = require('./路由模块化')
const app = express()
app.use(express.json())
app.use('/api', apiRouter)
//创建服务
app.listen(80, () => {
console.log('服务器启动完成');
})
模块化文件
const express = require('express')
const apiRouter = express.Router()
//编写get接口
apiRouter.get('/', (req, res) => {
//通过req.query获取客户端发送过来的数据
const query = req.query
res.send({
code: 200,
msg: '请求成功',
data: query
})
})
//编写post接口
apiRouter.post('/', (req, res) => {
//获取客户端传递过来的数据
const body=req.body
//将数据返回
res.send({
code: 200,
msg: '请求成功',
data: body
})
})
module.exports = apiRouter
基于CORS解决接口跨域的问题
通过CORS解决跨域问题(回去实验下)
const express = require('express')
const app = express()
//一定要在路由之前,配置CORS这个中间件,从而解决接口跨域的问题
const cors = require('cors') //使用const cors=require(’cors‘)导入中间件
app.use(cors())
app.use(express.json())
//引入路由模块
const apiRouter = require('./路由模块化')
app.use('/api', apiRouter)
//创建服务
app.listen(80, () => {
console.log('服务器启动完成');
})
什么是CORS
简单请求
预检请求
JSONP接口
十、MySQL的使用
安装MySQL
主要组成部分
基本使用