设置contentType时,jquery ajax无法正常工作

时间:2015-09-20 10:14:21

标签: jquery ajax node.js express

我在localhost:3000和localhost:3001上运行了两个节点js服务器。当我从localhost:3001到localhost:3000发出ajax POST请求时,没有任何反应。我已经检查了localhost:3000上的日志,它甚至没有收到POST请求。

这是我正在进行ajax调用的代码:

$.ajax({
    type:"POST",
    url:"http://localhost:3000/post/",
    contentType:"application/json",
    dataType:'json',
    data: JSON.stringify({name:'Bruce Wayne'}),
    success:function(response) {
        console.log(response);
    }
});

但是,当我删除contentType字段或将其更改为" text / plain"而不是" application / json",它的工作原理。在localhost:3000我也在响应中发送这些标题。

res.header("Access-Control-Allow-Origin", "*");

res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");

res.header("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS");

我已经经历了很多关于SO的问题,并尝试了一切。有人可以帮我弄清问题是什么吗?感谢。

2 个答案:

答案 0 :(得分:1)

这是jQuery长期存在的问题,个人而言,不要问我为什么,但工作解决方案是:

$.ajax({
    type: "POST",
    url:  "http://localhost:3000/post/",
    // contentType: "application/json", // Remove this bit.
    // dataType: 'json',                // Remove this bit.
    data: JSON.stringify({name:'Bruce Wayne'}),
    success:function(response) {
        console.log(response);
    }
});

在发送响应标头时,请勿提供application/jsonjavascript/jsontext/json。设为:text/htmltext/plain。如果有效,请告诉我。

答案 1 :(得分:0)

我能够自己解决这个问题并且只是发布这个答案,以防有人使用express和node在将来遇到类似的问题。

而不是将这三个标题添加到我的控制器函数中的响应中,如

router.get('/post', function(req, res){
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    res.header("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS");
    ... //rest of the code
})

我创建了一个中间件并在主app.js文件中使用它并且它神奇地工作。我完全不知道为什么,但它确实有效。

var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', "*");
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type');
next();
};

app.use(allowCrossDomain);