当前位置: 首页 > 面试题库 >

Node.js-使用Express获取原始请求正文

高嘉树
2023-03-14
问题内容

当我使用Express时,我的代码是:

app.use(express.bodyParser());

我将如何获得 原始请求正文


问题答案:

编辑2: 主体解析器模块的1.15.2版引入了原始模式,该模式将主体作为Buffer返回。默认情况下,它还会自动处理deflate和gzip解压缩。用法示例:

var bodyParser = require('body-parser');
app.use(bodyParser.raw(options));

app.get(path, function(req, res) {
  // req.body is a Buffer object
});

默认情况下,该options对象具有以下默认选项:

var options = {
  inflate: true,
  limit: '100kb',
  type: 'application/octet-stream'
};

如果您希望原始解析器解析以外的其他MIME类型application/octet- stream,则需要在此处进行更改。它还将支持通配符匹配,例如*/**/application

注意: 以下答案适用于Express
4之前的版本,其中中间件仍与框架捆绑在一起。现代等效项是主体解析器模块,必须单独安装。

rawBodyExpress中的属性曾经可用,但是从1.5.1版开始就删除了。要获取原始请求主体,必须在使用bodyParser之前放入一些中间件。您还可以在此处阅读有关GitHub的讨论。

app.use(function(req, res, next) {
  req.rawBody = '';
  req.setEncoding('utf8');

  req.on('data', function(chunk) { 
    req.rawBody += chunk;
  });

  req.on('end', function() {
    next();
  });
});
app.use(express.bodyParser());

该中间件将从实际数据流中读取数据,并将其存储在rawBody请求的属性中。然后,您可以像这样访问原始主体:

app.post('/', function(req, res) {
  // do something with req.rawBody
  // use req.body for the parsed body
});

编辑:
似乎此方法和bodyParser拒绝共存,因为一个方法将在另一个方法之前消耗请求流,从而导致第二个方法永远不会触发end,从而永远不会调用next(),并挂起您的应用程序。

最简单的解决方案很可能是修改bodyParser的源,您可以在Connect的JSON解析器的第57行中找到该源。这就是修改后的版本。

var buf = '';
req.setEncoding('utf8');
req.on('data', function(chunk){ buf += chunk });
req.on('end', function() {
  req.rawBody = buf;
  var first = buf.trim()[0];
  ...
});

您将在以下位置找到文件:

/node_modules/express/node_modules/connect/lib/middleware/json.js



 类似资料:
  • 我在循环中的节点JS中发送这样的GET请求 由于响应是异步的,是否可以在响应中获取原始请求URL? 谢谢!

  • 我有我的快递服务器运行在http://localhost:3000(我称之为网络服务器)我有另一个应用程序运行在localhost:8100(我称之为简单的应用程序) 当我的应用程序调用Web服务器时,我收到消息: “XmlHttpRequest无法加载http://localhost:3000/auth/facebook. 对飞行前请求的响应未通过访问控制检查。当凭据标志为true时,“访问控制

  • 问题内容: 当客户端/浏览器取消了挂起的HTTP请求时,带有Express的Node似乎继续处理该请求。对于密集请求,CPU仍然忙于处理不必要的请求。 有没有办法让Node.js / Express杀死/停止这些被要求取消的未决请求? 它给出的是,由于AngularJS 1.5 HTTP请求是容易变得特别有用的撤销通过调用上/ 对象。 当暴露提供自动完成或搜索字段结果的API方法时,可能会发生此类

  • 问题内容: 因此,我在这里可能遗漏了一些简单的东西,但似乎无法找到一种方法来获取向其发送响应的请求对象的主机名。 是否可以找出用户当前从node.js访问的主机名? 问题答案: 如果您在谈论HTTP请求,则可以在以下位置找到请求主机: 但这取决于传入的请求。 有关更多信息,请访问http://nodejs.org/docs/v0.4.12/api/http.html#http.ServerRequ

  • 这里有什么问题? 另外,我是否可以不使用而直接获取原始请求?

  • 一个星期以来,我一直在解决这个问题;我连接到我的服务器API并检索cookie。 然后我做了一个GET来检索JSON Cookie会话,但是我在跨源代码方面遇到了一个问题。 在API的一侧是可以的,因为我得到了一个良好的状态200。 答复如下: ============================================================= 响应:访问控制允许信任。。。真