sails.js获取文本/纯文本内容types的POST负载

我正在开发一个sails.js(基于快车的node.js框架)应用程序,这是很好,但我不能解决这个细节…

我需要从Internet Explorer 8和9跨域发送POST请求。为此,我不得不使用xDomainRequest对象,但不允许设置Contenttypes标题。

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

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

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

req.set("Content-type", "Apli..... 

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

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

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

有谁知道我怎样才能访问我的原始有效载荷,所以我可以自己parsing它。 谢谢!

我想在这种情况下,你将不得不实现自己的身体parsing器,你可以将其设置为sails.config.express.bodyParser或创build一个config/express.js文件,如:

 var express = require('express'); module.exports.express = { bodyParser: function(options) { // Get default body parser from Express var defaultBodyParser = express.bodyParser(options); // Get function for consumung raw body, yum. var getBody = require('raw-body'); return function (req, res, next) { // If there's no content type, or it's text/plain, parse text if (!req.headers['content-type'] || req.headers['content-type'].match('text/plain')) { // flag as parsed req._body = true; // parse getBody(req, { limit: 100000, // something reasonable here expected: req.headers['content-length'] }, function (err, buf) { if (err) return next(err); // Make string from buffer buf = buf.toString('utf8').trim(); // Set body req.body = buf.length ? {content: buf} : {} // Continue next(); }); } // Otherwise try the default parsers else return defaultBodyParser(req, res, next); }; } 

你必须npm install expressnpm install raw-body 。 请注意,此示例使用默认的Express身体分析器作为回退, 而不是默认的Sails主体分析器,它不会暴露在任何地方(而且大多数情况下与Express相同,不需要JSON重试)。

与最新版本的帆,使用快递已弃用。 我需要使用特定的parsing器从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); }; },