我使用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外,所有现代浏览器都能正常运行。
为了使Ajax调用成为可能,我必须使用这里提供的XDomainRequest脚本:https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest在添加此脚本之前,调用没有发生。
现在的问题是请求。如果数据来自IE8/IE9,我在Express中获得的body总是空的。
我想bodyParser无法解析从IE8/IE9收到的数据:请求。Body总是空的
我已经尝试解决这个问题一整天了,但是没有成功。
有什么想法或东西可以给我指出正确的方向吗?
因此,在深入研究这个问题(不久前)之后,我注意到content-type
标题在IE8和IE9上都是空的。
因为空不是默认值,我检查了是否有什么干扰了我的XDomainRequest设置,我发现jQuery-ajaxTransport-XDomainRequest正在改变xdr。内容类型设置为"(空)。
我为这个问题创建的解决方案是一个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
在IE9中,XDomainRequest没有设置内容类型,而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());