//1.导入express
const express = require('express')
//2.创建 web
const app = express
//3.发送get post 请求 监听客户端发过来的请求,并向客户端响应具体内容
app.get('/ures',(req,res)=>{
//通过express提供的send 方法,向客户端响应一个json对象
res.send({name:'zs',age:18,})
})
app.post('/ures',(req,res){
res.send('请求成功')
})
//4.启动 服务器
app.listen(3080,()=>{
console.log('express server running at http://127.0.0.1:3080')
})
通过Postman 查看验证效果.
//1.通过cmd终端 输入 node 当前文件名
//2.打开postman
注意:
每次修改内容都需要手动重新启动终端.通过ctrl + c
或者在npmjs 上面搜索 nodemon 这个工具. 在我们修改代码以后自动重启
在终端输入 npm install -g nodemon 全局安装
输入 nodemon 文件名 使用
express.static 的使用方法
//导入express
const express = require('express')
//创建一个web 服务器
const app = express()
//通过app.use(express.static)方法快速对台提供静态资源服务器
//html js css 都叫静态资源
//(./clock)代表把当前路径文件夹里面的所有文件都提供为静态资源
//访问静态资源文件的时候会根据添加的顺序查找.
//如果在第一个文件里面找到对应的文件,就不继续查找了
app.use(express.static('./clock'))
app.use(express.static('./files'))
//启动终端
app.listen(3080,() => {
console.log('express server running at http://127.0.0.1:3080')
})
通过在输入框添加对应的文件名 比如 html css js 访问对应的内容
挂载前缀,
挂载前缀的目的就是给访问的路径添加一个对应的说明,能更清楚的知道自己在访问什么地址
//挂在路径前缀.在express.static前面添加一个新的名字
app.use('/abc',express.static('./clock'))
express 路由
1.请求方式
2.请求路径
3.请求参数
路由的匹配过程
当请求的方式和请求的路径 同时匹配成功以后.调用对应的处理函数
// 挂载路由
app.get('/', (req, res) => {res.send('hello world.')})
app.post('/', (req, res) => { res.send('Post Request.')})
注意:
不建议直接挂载到app上.可以使用路由模块创建路由模块
//先创建一个router.js文件夹
const express = require('express')
const router = express.Router()
router.get('/ures', (req, res) => {
res.send('hello')
})
router.post('/uress', (res, req) => {
res.send('请求成功')
})
//通过 module.exports 暴露出去
module.exports = router
//然后使用之前创建的router.js
const express = require('express')
const app = express()
app.use(require('./router.js'))
app.listen(3020, () => {
console.log('http://127.0.0.1:3020');
})
中间件
中间件就是某件事物从开始到结束中间实现的过程.特指某些中间环节.
express中间件本质上就是一个function 处理函数..
app.get('/', function(req,res,next){ })
next函数是实现多个中间件调用的关键.他表示把关系转交给下一个中间件或者路由.
//定义最简单的中间件函数
const express = require('express')
const app = express()
// const mw = function (req, res, next) {
// console.log('中间件函数');
// //把扭转关系转交给下一个中间件或者路由
// next()
// }
// //客户端发现的任何请求.达到服务器以后都会触发中间件,叫做全局生效的中间件
// //将mw注册全局生效的中间件
// app.use(mw)
//定义全局中间件的简化写法
app.use((req, res, next) => {
console.log('中间件函数');
//把扭转关系转交给下一个中间件或者路由
next()
})
app.get('/', (req, res)=>{
res.send('hello')
})
app.get('/usd', (req, res)=>{
res.send('你好')
})
app.listen(3033, () => {
console.log('http://127.0.0.1:3033');
})
他们之间是共享同一个res.req,通过上由属性下由也有效果
const express = require('express')
const app = express()
app.use((req, res, next) => {
console.log('中间件函数');
//把扭转关系转交给下一个中间件或者路由
const time = Date.now()
res.startTime = time
next()
})
app.get('/', (req, res)=>{
res.send('hello ' + res.startTime)
})
app.get('/usd', (req, res)=>{
res.send('你好 ' + res.startTime)
})
app.listen(3033, () => {
console.log('http://127.0.0.1:3033');
})
通过app.use可以定义多个中间件.会按定义的先后顺序打印
const express = require('express')
const app = express()
const mw = (req, res, next) => {
console.log('第一个');
next()
}
const mm = (req, res, next) => {
console.log('第二个');
next()
}
//单独使用的时候
app.get('/',mw,(req,res)=>{
res.send('你好')
})
//使用多个的时候使用 [] 或者,隔开
app.get('/', [mw,mm], (req, res) => {
res.send('hello')
})
app.get('/', mw, mm, (req, res) => {
res.send('hello')
})
app.listen(3033, () => {
console.log('http://127.0.0.1');
})
注意事项
-
一定要在路由之前注册中间件 (不绝对)
-
客户端发送过来的请求,可以连续调用多个中间件进行处理
-
执行完中间件的业务代码之后,不要忘记调用
next()
函数 -
为了防止代码逻辑混乱,调用
next()
函数后不要再写额外的代码 -
连续调用多个中间件时,多个中间件之间,共享
req
和res
对象
中间件的分类.
-
应用级别的中间件
-
路由级别的中间件
-
错误级别的中间件
-
Express 内置的中间件
-
第三方的中间件
1.通过app.use() app.get() app.post()绑定在app实例上的中间件,叫做应用级别的中间件
2,绑定在 express.Router() 实例上的中间件叫做路由级别的中间件...
绑定在不同的实例上叫法不一样.
错误级别的中间件..
用来捕获整个项目中发生的错误,从而防止项目崩溃
1.必须放在路由器之后.
2.必须由四个参数.(err ,req, res ,next)
const express = require('express')
const app = express()
app.get('/', (req, res) => {
throw new Error('服务器错误')
res.send('hello')
})
app.use((err, req, res, next) => {
console.log('发生错误' + err.message);
res.send('Error:'+ err.message)
})
app.listen(3033, () => {
console.log('http://127.0.0.1:3033');
})
内置中间件
1.express.static 快速托管静态资源
2.express.json 解析json格式的请求体 仅4.16版本以后中使用 只能发送post请求.不能发get
3.express.urlencoded 解析 URL-encoded 格式请求数据 4.16以后兼容 只能发送post
// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()
// 注意:除了错误级别的中间件,其他的中间件,必须在路由之前进行配置
// 通过 express.json() 这个中间件,解析表单中的 JSON 格式的数据
app.use(express.json())
// 通过 express.urlencoded() 这个中间件,来解析 表单中的 url-encoded 格式的数据
app.use(express.urlencoded({ extended: false }))
app.post('/user', (req, res) => {
// 在服务器,可以使用 req.body 这个属性,来接收客户端发送过来的请求体数据
// 默认情况下,如果不配置解析表单数据的中间件,则 req.body 默认等于 undefined
console.log(req.body)
res.send('ok')
})
app.post('/book', (req, res) => {
// 在服务器端,可以通过 req,body 来获取 JSON 格式的表单数据和 url-encoded 格式的数据
console.log(req.body)
res.send('ok')
})
// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(80, function () {
console.log('Express server running at http://127.0.0.1')
})
express.json() 在Postman打开检测
express.urlencodde() 在Postman打开检测
第三方中间件.
第三方个人或者第三方团队开发的,自己按需下载配置
1.npm i -g body-parser 下载
2.require导入
3.app.use使用
app.use(parser.urlencoded({ extended: false }))
// app.use(express.urlencoded({ extended: false }))
内置的express.urlencoded就是通过第三方parser.urlencoded进一步开发的