XMLHttpRequest cannot load http://localhost:8080/api/test. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin. 

我读过跨域ajax请求,了解底层的安全问题。在我的例子中,两台服务器在本地运行,并且喜欢在测试期间启用跨域请求。

localhost:8080 - Google Appengine dev server
localhost:3000 - Node.js server

当我的页面从节点服务器加载时,我发出ajax请求到localhost:8080 - GAE服务器。什么是最简单,最安全的(不想启动chrome禁用web-security选项)。如果我必须改变“内容类型”,我应该在节点服务器上这样做吗?如何?


当前回答

在router.js中,只需在调用get/post方法之前添加代码。它对我来说没有错误。

//Importing modules @Brahmmeswar
const express = require('express');
const router = express.Router();

const Contact = require('../models/contacts');

router.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
  });

其他回答

使用dataType: 'jsonp',为我工作。

   async function get_ajax_data(){

       var _reprojected_lat_lng = await $.ajax({

                                type: 'GET',

                                dataType: 'jsonp',

                                data: {},

                                url: _reprojection_url,

                                error: function (jqXHR, textStatus, errorThrown) {

                                    console.log(jqXHR)

                                },

                                success: function (data) {

                                    console.log(data);



                                    // note: data is already json type, you just specify dataType: jsonp

                                    return data;

                                }

                            });





 } // function               

我接受@火箭危险品的答案,因为它让我找到了解决方案。我需要在GAE服务器上设置标头。我必须设置这些

"Access-Control-Allow-Origin" -> "*"
"Access-Control-Allow-Headers" -> "Origin, X-Requested-With, Content-Type, Accept"

仅设置“Access-Control-Allow-Origin”出错

Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers.

同样,如果需要发送认证令牌,也要添加这个

"Access-Control-Allow-Credentials" -> "true"

同样,在客户端,设置withCredentials

这将导致2个请求发送到服务器,其中一个带有OPTIONS。认证cookie没有随它一起发送,因此需要在外部认证处理。

如果有人正在寻找解决方案,如果您正在使用express,这里是快速解决方案。

const express = require('express')
const cors = require('cors')
const app = express()

1)使用NPM install cors—save

2) import it [require] const cors = require('cors')

3)使用它作为中间件app.use(cors())

详细的安装和使用cors。 就是这样,希望它能起作用。

如果你正在使用express,你可以使用cors中间件如下所示:

var express = require('express')
var cors = require('cors')
var app = express()

app.use(cors())

如果你是谷歌Chrome浏览器,试着安装这个插件:

https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi/related