Express
脚手架安装:npx express-generator
路由
基本使用
js
// 引入 express框架
const express= require('express');
// 创建网站服务器
const app = express();
// 对所有请求方法
app.all('/secret', (req, res, next) => {
console.log('Accessing the secret section ...');
next(); // 调用下一个匹配的路由或中间件
});
// 根据需求解决跨域问题
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type');
res.header('Access-Control-Allow-Methods', '*');
next();
});
// 对应get请求方法
app.get('/', (req, res,next)=> {
//结束响应
res.end()
// 结束响应并设置响应码
res.status(404).end()
// 结束响应并返回json格式内容
res.json({a:1})
// 结束响应并返回内容
res.send('hello world');
// 继续将请求传给下一个中间件
next()
// 重定向
res.redirect('http://baidu.com')
// 文件下载,第一个参数为下载文件路径,第二个参数为下载后文件名,第三个参数为出错回调
// 下载文件路径可以使用绝对路径,也可使用相对路径(启动 Node.js 进程的目录)
res.download(filePath, (err) => {
if (err) {
// 如果出现错误,发送响应表示失败
res.status(500).send('error');
}
});
})
// 监听端口
app.listen(3000);
console.log('网站服务器启动成功');
模块化
js
// 创建client.js,存放/client路径下的路由
const express = require('express');
// 创建路由对象
const client = express.Router();
// 挂载路由
client.get('/index', (req, res) => {
res.send('客户端首页')
});
module.exports = client;
// 创建admin.js,存放/admin路径下的路由
const express = require('express');
// 创建路由对象
const admin = express.Router();
// 挂载路由
admin.get('/index', (req, res) => {
res.send('管理端首页!')
});
module.exports = admin;
// app.js绑定两个模块,路径将会拼接为/client/index,和/admin/index
const express = require('express');
// 创建网站服务器
const app = express();
// 导入路由模块
const client = require('./route/client');
const admin = require('./route/admin');
// 路径匹配
app.use('/client', client);
app.use('/admin', admin);
app.listen(3000);
console.log('网站服务器启动成功');参数获取
query参数
js
// 通过req.query获取,
// URL:http://localhost:3000/?user=1&add=2,获取为对象:{"user":"1","add":"2"}
app.get('/', (req, res)=> {
res.send(req.query);
})path 参数
js
// 获取params需要事先使用占位`/:xxx`进行占位,然后才能够使用`req.params`获取到对应的值
app.get('/index/:id/:name/:age', (req, res)=> {
// 路径参数
res.send(req.params); //{"id": "10", "name": "zhangshan", "age": "18" }
})body 参数
js
const express = require('express');
const app = express();
// 引入 body-parser 模块
const bodyParser = require('body-parser');
// 解析表单结构数据
app.use( bodyParser.urlencoded({extended: false}));
// 解析json、text、raw等类型数据
// app.use( bodyParser.json() );
// app.use( bodyParser.text());
// app.use( bodyParser.raw());
app.post('/add', (req, res) =>{
// 接收 post 请求参数 req.body
res.send(req.body);
})
app.listen(3000);
console.log('服务器启动成功');中间件
中间件方法由 Express 提供,负责拦截请求,对同一个请求可以设置多个中间件
- 默认情况下,请求从上到下依次匹配中间件,一旦匹配成功,终止匹配。
- 可以调用 next 方法,将请求的控制权交给下一个中间件,直到遇到结束请求的中间件
基本使用
js
// 引入 express框架
const express= require('express');
// 创建网站服务器
const app = express();
// 放在实际请求前面,对拦截到的请求做一些操作(app.use默认是对所有请求)
// app.use也可以传递第一个路径参数,表示对该路径下请求才添加该中间件
app.use((req, res, next) => {
res.send('一系列操作')
if(condition){
// 放行
next()
} else {
res.send("结束请求")
}
})
// 实际请求方法
app.get('/admin', (req, res)=> {
res.send('您已经登录,可以访问当前页面')
})
// 放在实际请求后面,如果前面所有请求都没返回响应,可以在此处作某些操作
app.use((req, res, next) => {
// 为客户端 响应状态码和提示信息
res.status(404).send('当前访问的页面是不存在的.')
})
// 监听端口
app.listen(3000);
console.log('网站服务器启动成功');错误中间件
js
const express = require('express');
const app = express();
// 同步操作中的错误信,通过抛出错误对象,中间件就可以接收到错误
app.get('/index', (req, res) =>{
// 抛出错误对象
throw new Error('程序发生了未知错误')
res.send('程序正常执行')
})
// 异步API操作中的错误不能捕获到,需要使用next方法,并把错误信息传入才可以触发错误中间件
app.get('/index', (req, res, next) =>{
fs.readFile('./demo.txt','utf-8', (err, data) => {
// 文件读取失败
if(err != null) {
next(err); // 触发 错误处理中间件
} else {
res.send(data)
}
})
})
// 错误处理中间件,当触发错误时会调用该中间件
app.use((err, req, res, next) => {
// res.status(500).send('服务器端错误');
res.status(500).send(err.message);
})
app.listen(3000);
console.log('网站服务器启动成功');