sails.js获取具有text / plain内容类型的POST有效内容

时间:2014-01-15 15:36:40

标签: node.js post express sails.js

我正在开发一个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();
    });

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

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

3 个答案:

答案 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 expressnpm 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);  
},