Sails.js 使用文本/纯内容类型获取 POST 有效负载

max*_*ijb 3 post node.js express sails.js

我正在开发一个sails.js(基于express的node.js框架)应用程序,这很棒但是]我无法解决这个细节......

我需要从 Internet Explorer 8 和 9 跨域发送 POST 请求。为此,我被迫使用 xDomainRequest 对象,这不允许设置内容类型标头。

因此,当请求到达服务器时,内容类型是“text/plain”,它不会触发 bodyParser express 中间件,所以我的 req.body 是一个空对象,我看不到我正在发送的有效负载从客户端。

为此,我尝试了两件事但没有运气:

首先,我想在我的第一个中间件中为请求设置一个标头,这当然不可用:

  req.set("Content-type", "Apli.....
Run Code Online (Sandbox Code Playgroud)

然后,我创建了一个监听 req.on('data') 的中间件,如下所示:

        var data = "";
    req.on('data', function(chunk){ 
        data += chunk; 
    });
    req.on('end', function(){
       req.rawBody = data;
       next();
    });
Run Code Online (Sandbox Code Playgroud)

但是数据事件永远不会触发!

有谁知道我如何访问我的原始负载,以便我自己解析它。谢谢!

小智 7

对于最新版本的 Sails,不推荐使用 express。我需要使用特定的解析器从 Stripe API 获取原始数据。这是我的代码,也许它会帮助某人:

bodyParser: function(req, res, next) {
  var skipper = require('skipper')();
  var rawParser = require("body-parser").raw({type: "*/*"});

  // Create and return the middleware function
  return function(req, res, next) {
    sails.log.debug(req.headers);
    if (req.headers && req.headers['stripe-signature']) {
      sails.log.info('request using raw parser middleware');
      return rawParser(req, res, next);
    }
    // Otherwise use Skipper to parse the body
    sails.log.info('request using skipper middleware');
    return skipper(req, res, next);
  };
},
Run Code Online (Sandbox Code Playgroud)