//导入模块
const express = require('express');
//创建应用
const app = express();//设置路由
app.get('/',(req,resp)=>{//输出响应console.log('request coming.............');resp.json(req.headers);
});app.get('/user/:id', (req, res) => {const userId = req.params.id; // 获取 URL 中的路由参数res.send(`User ID: ${userId}`);
});app.get('/user/userId', (req,resp) => { resp.json({method: req.method,path: req.path,url: req.url,query: req.query,params: req.params,headers: req.headers,cookies: req.cookies,ip: req.ip || req.ips});
}); app.get('/user2/:id/name/:name', (req, res) => {const userId = req.params.id; // 获取 URL 中的路由参数res.send(`User ID: ${userId}`);
});//多个路由函数app.get('/tt', (req,resp,next) => { console.log('${req.method} ${req.path}');next();
}, (req, resp) => {resp.send('首页');
});function logger(req, resp, next) { console.log('${req.method} ${req.path}');next();
};function home(req, resp) { resp.send('首页');
}app.get('/tt2', [logger, home]);//公共路由
app.get('/usr/login', (req, resp) => { resp.send('登录页面');
});
app.post('/usr/login', (req, resp) => { resp.send('登录处理');
});
//将上面的两个总方法合并为一个
app.route().get((req, resp) => { resp.send('登录页面');}).post((req, resp) => {resp.send('登录处理');});app.listen(8080,()=>{console.log('listening on 8080');
});
模块化路由
//Express 提供的Router 对象可以实现路由和入口JS的解耦,用于模块化的路由有以下有点:
const express = require('express');
const router = express.Router();
router.get('/login', (req,resp) => { console.log('${req.method} ${req.path}');resp.send('登录');
});router.get('/register', (req,resp) => { console.log('${req.method} ${req.path}');resp.send('注册');
});module.exports = router; =====================================const express = require('express');
const router = express.Router();
router.get('/list', (req,resp) => { console.log('${req.method} ${req.path}');resp.send('动态列表');
});
module.exports = router;
=================================const express = require('express');
const router = express.Router();
router.get('/list', (req,resp) => { console.log('${req.method} ${req.path}');resp.send('动态列表');
});
module.exports = router; =========================================
//导入模块
const express = require('express');
//创建应用
const app = express();const user = require('./user');
const timeline = require('./timeline');app.use('/user', user);
app.use('/timeline',timeline);app.listen(8080,()=>{console.log('listening on 8080');
});//上面的代码最终会生成一下路由
// get /user/login
// get /user /register
// get /timeline/list
=============================================
请求获取cookie
安装cookie-parser
C:\Users\Administrator\Desktop\expres-example>npm install cookie-parser --save
added 2 packages in 3s
14 packages are looking for funding
run npm fund
for details
编写代码
//导入模块
const express = require('express');
const cookieParser = require('cookie-parser');
//创建应用
const app = express();
app.use(cookieParser());
app.get('/',(req,resp)=>{//输出响应console.log('request coming.............');resp.json({cookies: req.cookies});
});app.listen(8080,()=>{console.log('listening on 8080');
});
获取请求体
安装 body-parser
C:\Users\Administrator\Desktop\expres-example>npm install body-parser --save
up to date in 2s
14 packages are looking for funding
run npm fund
for details
编写代码
//导入模块
const express = require(‘express’);
const cookieParser = require(‘cookie-parser’);
const bodyParser = require(‘body-parser’);
//创建应用
const app = express();
app.use(cookieParser());
app.use(bodyParser());
app.get(‘/’,(req,resp)=>{
//输出响应
console.log(‘request coming…’);
resp.json({cookies: req.cookies});
});
Express 4.16.0版本开始 新版本已经不能使用了 报错如下
Error: The bodyParser() generic has been split into individual middleware to use instead.
at bodyParser (c:\Users\Administrator\Desktop\expres-example\node_modules\body-parser\index.js:79:9)
at Object. (c:\Users\Administrator\Desktop\expres-example\src\cookie.js:8:9)
at Module._compile (node:internal/modules/cjs/loader:1730:14)
at Object…js (node:internal/modules/cjs/loader:1895:10)
at Module.load (node:internal/modules/cjs/loader:1465:32)
案例:
const express = require(‘express’);
const bodyParser = require(‘body-parser’);
const app = express();
// 解析 application/json 类型的数据
app.use(bodyParser.json());
// 解析 application/x-www-form-urlencoded 类型的数据
app.use(bodyParser.urlencoded({ extended: true }));
app.post(‘/your-endpoint’, (req, res) => {
console.log(req.body); // 这里可以访问到POST请求的body参数
res.send(‘Data received’);
});
app.listen(3000, () => {
console.log(‘Server is running on port 3000’);
});
====================================
express 原始方式的post请求 参数获取
//导入模块
const express = require('express');
const cookieParser = require('cookie-parser');
//const bodyParser = require('body-parser');
//创建应用
const app = express();
app.use(cookieParser());
// 解析application/x-www-form-urlencoded
app.use(express.urlencoded({ extended: true }));// 解析 application/json
app.use(express.json()); //app.use(bodyParser());
app.get('/',(req,resp)=>{//输出响应console.log('request coming.............');resp.json({cookies: req.cookies});
});
app.post('/user',(req,resp)=>{//输出响应console.log('request coming.............');resp.json(req.body);
});
app.listen(8080,()=>{console.log('listening on 8080');
});
使用raw-body中间件(对于非JSON/URL编码的body)
如果你需要处理非JSON或URL编码格式的body(例如,原始的二进制数据),你可以使用raw-body中间件。首先,安装raw-body
npm install raw-body
const express = require('express');
const rawBody = require('raw-body');
const app = express();app.use((req, res, next) => {rawBody(req, {length: req.headers['content-length'],limit: '1mb', // 设置最大限制大小,防止内存溢出encoding: rawBody.TEXT // 或者 rawBody.RAW,根据需要选择文本或原始二进制数据格式}, (err, string) => {if (err) return next(err); // 处理错误情况req.text = string; // 将解析后的文本或二进制数据添加到req对象上,以便后续处理next(); // 继续执行下一个中间件或路由处理函数});
});app.post('/your-endpoint', (req, res) => {console.log(req.text); // 这里可以访问到POST请求的原始body数据(文本或二进制)res.send('Data received');
});app.listen(3000, () => {console.log('Server is running on port 3000');
});
==========================================
响应对象:
repsonse.status() 响应状态
response.set(field[,value]) 设置响应包头
response.download() 通过设置 Content-Disposition 响应头提示客户端下载
response.download(path[,filename],[,option],[,callback])
app.get('/download', function(req, res) {var filePath = '/path/to/file'; // 文件路径var fileName = 'example.txt'; // 可选的文件名res.download(filePath, fileName);
});
response.end() 结束响应
response.redirect() 重定向
response.render() 页面渲染
response.cookie() 设置cookie
cookie 包含的属性:
name
value
options 选项:
domain 域名
expire GMT 到期时间,如果没有设置或者为0 ,则关闭浏览器之后失效
httpOnly 讲cookie标记为只有http 服务请求才能访问
maxAge : 以毫秒为单位的过期时间,比expire GMT更灵活
path cookie 的路径
secure 标记只有在https 协议下才能请求
signed 表示是否对 cookie 签名
repsones.send() 发送http 响应