我正在开发一个sails.js(基于express的node.js框架)aplication,这很好但是我无法解决这个细节......
我需要从Internet Explorer 8和9发送跨域的POST请求。为此我不得不使用xDomainRequest对象,它不允许设置内容类型标头。
因此,当请求到达服务器时,内容类型是“text / plain”,它不会触发bodyParser express中间件,所以我的req.body是一个空对象,我看不到有效负载我从客户那里发送。
为此,我尝试了两件事,但没有运气:
首先,我想在我的第一个中间件中为请求设置一个标头,当然不可用:
req.set("Content-type", "Apli.....
然后,我创建了一个监听req.on('data')的中间件,如下所示:
var data = "";
req.on('data', function(chunk){
data += chunk;
});
req.on('end', function(){
req.rawBody = data;
next();
});
但数据事件永远不会发生!
有谁知道如何访问我的原始有效负载,所以我可以自己解析它。 谢谢!
答案 0 :(得分:2)
我认为在这种情况下,您必须实现自己的身体解析器,您可以将其设置为sails.config.express.bodyParser
或创建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 express
和npm install raw-body
。请注意,此示例使用默认的Express正文解析器作为后备,不默认的Sails正文解析器,它在任何地方都没有公开(并且大部分与Express相同,没有JSON重试)。 / p>
答案 1 :(得分:2)
使用最新版本的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);
};
},
答案 2 :(得分:1)
maxime 的回答大部分是正确的。需要做的小改动如下:
bodyParser: function(req, res, next) {
var skipper = require('skipper')();
var rawParser = require("body-parser").raw({type: "*/*"});
// Create and return the middleware function
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);
},