浏览器中JavaScript在浏览器中的运行环境(代码正常运行需要的环境),

Node.js后端的运行环境,通过Node.js可以实现用JavaScript后端开发
Node.js是一个基于Chrome V8引擎的JavaScript运行环境

读取指定文件中的内容
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模块路径拼接的问题



../ 会抵消一层路径

获取文件名
移出文件扩展名



代码:
- //引入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"
- }






- //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) 给路由添加前缀



定义中间件函数
- 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
主要组成部分

基本使用
