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

  显示原文与译文双语对照的内容

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

我需要发送来自 IE 8和 9的POST请求跨域。 因为我不得不使用xDomainRequest对象,它不允许设置内容类型头。

因这里,当请求到服务器时,内容类型是"文本/普通",不会激发bodyParser中间件,因这里我的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();
 });

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

我是否知道如何访问我的原始负载,这样我就可以自己解析它。 谢谢!

时间: 作者:

我想在这种情况下,你必须实现你自己的主体解析器,你可以设置为 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 expressnpm install raw-body 。 注意这个例子使用默认的表示体解析器作为回退,而不是默认的,默认的帆体解析器在任何地方都没有暴露出来。

作者:
...