【问题标题】:Express bodyParser cannot parse data coming from Internet ExplorerExpress bodyParser 无法解析来自 Internet Explorer 的数据
【发布时间】:2014-08-29 07:31:42
【问题描述】:

我使用 Node 和 Express 4 创建了一个服务器应用程序,而前端是使用 jQuery 构建的。 我有一个 Ajax 调用使用 POST 向服务器发送一些数据:

$.ajax({
     cache: false,
     type: 'POST',
     url: Config.API_ENDPOINT_REGISTRATION,
     dataType : 'json',
     data: info,
     success: this.successHandler.bind(this)
 });

除 IE8 和 IE9 外,所有现代浏览器中的一切都按预期运行。

为了让 jQuery 调用 Ajax 成为可能,我必须使用这里提供的 XDomainRequest 脚本:https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest 在添加此脚本之前,没有发生调用。

现在的问题是,如果数据来自 IE8/IE9,我在 Express 中获取的 request.body 始终为空。

我想 bodyParser 出现了问题,无法解析从 IE8/IE9 接收到的数据:request.body 始终为空。

我已经尝试解决这个问题一整天了,但没有成功。

有什么想法或东西可以为我指明正确的方向吗?

【问题讨论】:

    标签: jquery ajax internet-explorer express


    【解决方案1】:

    所以在深入研究了这个问题之后(不久前),我注意到content-type 标头在 IE8 和 IE9 上都是空的。

    因为空不是默认值,所以我检查了是否有东西干扰了我的 XDomainRequest 设置,我发现 jQuery-ajaxTransport-XDomainRequest 正在将 xdr.contentType 更改为“”(空)。

    我为这个问题创建的解决方案是一个 Express.js 中间件,用于设置/覆盖对特定路由的请求的内容类型标头。这是一个使用示例:

    var express = require('express');
    var app = express();
    var bodyParser = require('body-parser');
    var registrationController = require('./controllers/registrationController');
    
    server.use( '/registration', contentTypeOverride({
        contentType: 'application/x-www-form-urlencoded'
    }));
    server.use( bodyParser.json() );
    server.use( bodyParser.urlencoded({
        extended: true
    }));
    
    app.post( '/registration', registrationController.index );
    
    app.listen( 3000 );
    

    你可以在这里找到中间件:express-content-type-override

    【讨论】:

      【解决方案2】:

      在 IE9 中 XDomainRequest doesn't set a content-type,bodyparser 需要它来将请求正文读取为 json。

      我通过在将请求传递给正文解析器之前明确设置内容类型来解决这个问题,如下所示:

      app.use(function(req, res, next) {
          // IE9 doesn't set headers for cross-domain ajax requests
          if(typeof(req.headers['content-type']) === 'undefined'){
              req.headers['content-type'] = "application/json; charset=UTF-8";
          }
          next();
      })
      .use(bodyParser.json());
      

      【讨论】:

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