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();
  });

其他回答

将此添加到您的NodeJS服务器,如下所示:

app.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();
});

因为它们运行在不同的端口上,所以它们是不同的JavaScript来源。它们是否在同一台机器/主机名上并不重要。

您需要在服务器(localhost:8080)上启用CORS。看看这个网站:http://enable-cors.org/

你所需要做的就是向服务器添加一个HTTP报头:

Access-Control-Allow-Origin: http://localhost:3000

或者,为了简单起见:

Access-Control-Allow-Origin: *

如果你的服务器试图设置cookie,而你使用withCredentials = true,不要使用“*”

在响应已验证的请求时,服务器必须指定一个域,并且不能使用通配符。

你可以在这里阅读更多关于withCredentials的信息

如果你使用快捷方式,

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

如果你正在使用app.use(express.json());在你的服务器文件中使用JSON有效负载来解析传入请求,并且是基于body解析器的,请记住在使用app.use(cors())代码行之后使用它。否则,可能会出现安全问题。 歌珥

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

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

app.use(cors())

在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();
  });