nodejs 路由/请求

复制代码
//导入模块
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 响应