【问题标题】:sails.js Getting a POST payload with text/plain content typesails.js 获取具有文本/纯内容类型的 POST 有效负载
【发布时间】:2014-02-04 04:08:14
【问题描述】:

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

我需要从 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();
    });

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

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

【问题讨论】:

    标签: node.js post express sails.js


    【解决方案1】:

    在最新版本的 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);
      };
    },
    

    【讨论】:

    • 你能分享更多这个例子吗?我也有同样的情况。我不知道把bodyParser放在哪里。
    • bodyParser 进入 config/http.js
    【解决方案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 重试)。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多