2014-01-15 33 views
2

我正在開發一個sails.js(基於express的node.js框架)應用程序,這很順利,但是我無法解決這個細節..sails.js獲取文本/純文本內容類型的POST負載

我需要從Internet Explorer 8和9跨域發送POST請求。爲此,我不得不使用xDomainRequest對象,但不允許設置Content type標頭。

所以,當請求到達服務器時,內容類型是「text/plain」,它不會觸發bodyParser express中間件,所以我的req.body是一個空對象,我看不到有效載荷我從客戶端發送。

對於這個我試過,沒有運氣了兩兩件事:

首先,我想一個標題設置爲我的第一個中間件的要求,這當然是不可用:

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

然後我創建了一個偵聽req.on(「數據」),這樣的中間件:

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

但數據事件永遠不會觸發!

有誰知道我如何訪問我的原始負載,所以我可以自己解析它。 謝謝!

回答

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重試)。

+0

謝謝!我不知道我可以創建一個配置/快遞... – maxijb

1

使用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); 
    }; 
}, 
+0

聰明的解決方案謝謝! –