express获取原始请求体内容

引入了app.use(express.json());

req.body会自动被解析为json对象。

如果需要获取原始的请求体 buffer格式的二进制原始数据怎么办呢?

网络上的教程试了好多都不太好用了,好多都是几年前发的,又让引入其他的包,简直太反人类了。

看我的代码片段,直接搞定,实测好用:

const app = express();


// ==================  记录原始请求体  ===============
// 注意,顺序不能错,这个捕获原始请求体要在其他中间件前面
// 捕获原始请求体(注意看这一段代码!!!)
app.use(function (req, res, next) {
  var reqData = [];
  var size = 0;
  req.on('data', function (data) {
    reqData.push(data);
    size += data.length;
  });
  req.on('end', function () {
    req.reqData = Buffer.concat(reqData, size);
    next();
  });
});



// ==================  这些代码不用看  ===============
// 添加 express.json() 中间件来解析 JSON 格式的请求体
app.use(express.json());
// 添加 express.urlencoded() 中间件来解析 URL 编码的请求体
app.use(express.urlencoded({ extended: true }));
// 设置静态文件目录
app.use(express.static('public'));



// ==================  获取原始请求体  ===============
// 在其他中间件的后面再写这个,获取 req.reqData 就可以了
// 比如下面是我验签用的代码,判断请求头上面的md5
app.use((req, res, next) => {
  // 在此处添加公共的前置处理逻辑
  if (req.method == 'POST') {//MD5校验
    //使用md5加密模块取原始请求的摘要
    const reqData = req.reqData + Buffer.from(conf.key);
    const md5 = crypto.createHash('md5').update(reqData).digest('hex');

    if (md5 === req.headers['x']) {
      next(); // 校验通过,调用 next() 以将控制权传递给下一个中间件或路由处理函数
    } else {
      res.status(403).send('请求被拒绝,MD5校验失败');
    }

  } else {
    next(); // 调用 next() 以将控制权传递给下一个中间件或路由处理函数
  }
});



// ==================  业务接口  ===============
// 世界播报接口 这是我的业务接口,当然在业务接口里面也是可以调用 req.reqData 获取原始请求的
app.post('/sendWordMessage', (req, res) => {
  const requestBody = req.body;

  // 遍历所有连接的客户端发送数据
  clients.forEach(client => {
    if (client.readyState === WebSocket.OPEN) {
      client.send(JSON.stringify(requestBody));
    }
  });

  res.sendStatus(200);
});

新增加一个用法,省时省力:

// 用express内置的方法捕获原始请求体
app.use(express.raw({ type: '*/*' }));

// 后续的中间件,路由 可以使用req.body 获取到请求体

Express.js是一个Node.js框架,主要用于构建Web应用程序。MD5是一种广泛使用的哈希函数,用于将任意长度的数据转换为固定长度的字符串,通常用于数据摘要而非加密。在Express应用中,如果你需要对用户提供的MD5值进行解密(实际上这是不可能的,因为MD5是单向的),你需要做的是验证MD5是否匹配预期的原始数据的哈希。 首先,确保你有一个已知的原始数据(明文)和其对应的MD5哈希值。当你接收到请求并需要检查MD5一致性时,可以按照以下步骤操作: 1. 客户端发送MD5哈希值作为HTTP请求的一部分,例如GET请求的查询参数或POST请求的身内容。 2. 在服务器端,使用JavaScript的内置`crypto`模块来计算明文的MD5哈希。例如: ```javascript const crypto = require('crypto'); const md5 = (data) => { return crypto.createHash('md5').update(data).digest('hex'); }; ``` 3. 接收到来自客户端的MD5值后,你可以将其与本地存储的哈希值进行比较: ```javascript const clientProvidedMD5 = req.query.mypasswordMD5; // 假设从查询参数获取 const storedMD5 = getFromDatabase(); // 从数据库或其他地方获取 if (md5(storedData) === clientProvidedMD5) { // MD5匹配,继续处理请求 } else { // MD5不匹配,返回错误信息或拒绝访问 } ``` 请注意,MD5解密不是安全实践,因为它是不可逆的。这里所说的“解密”只是验证两个哈希值是否一致,并非真正的密码恢复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值