我在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的问题,并尝试了一切。有人可以帮我弄清问题是什么吗?感谢。
答案 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/json
或javascript/json
或text/json
。设为:text/html
或text/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);