Node.js 角度:无';访问控制允许原点';请求的资源上存在标头

Node.js 角度:无';访问控制允许原点';请求的资源上存在标头,node.js,angular,express,deployment,cors,Node.js,Angular,Express,Deployment,Cors,我可以通过一些本地临时修复来传递这个错误。但现在,我正在将应用程序移动到web。花了两天时间试图找出这个CORS错误。在我的VDS上,我有x.x.x.x:4200和x.x.x.x:3000作为角度和nodejs/express设置。两者都可以在互联网上访问 我所尝试的: 在客户端和服务器上设置与CORS相关的头 设置app.use(cors()) 也许我的尝试是错误的,所以你可以提出一些澄清相同的方法 在客户端获取请求: apiUrl = 'http://46.245.165.120:30

我可以通过一些本地临时修复来传递这个错误。但现在,我正在将应用程序移动到web。花了两天时间试图找出这个CORS错误。在我的VDS上,我有x.x.x.x:4200和x.x.x.x:3000作为角度和nodejs/express设置。两者都可以在互联网上访问

我所尝试的:

  • 在客户端和服务器上设置与CORS相关的头
  • 设置
    app.use(cors())
也许我的尝试是错误的,所以你可以提出一些澄清相同的方法

在客户端获取请求:

apiUrl = 'http://46.245.165.120:3000/';
this.http.get(this.apiUrl + `users/${type}`, { headers: { 'Authorization': `Bearer ${this.getToken()}` ,
          'Access-Control-Allow-Origin':'*',
          'Access-Control-Allow-Methods': 'GET, POST, PATCH, PUT, DELETE, OPTIONS',
          'Access-Control-Allow-Headers': 'Origin, Content-Type, X-Auth-Token'
        }});
服务器端头和CORS设置:

var originsWhitelist = [
    'http://localhost:4200',      //this is my front-end url for development
    'http://x.x.x.x:4200',
    'http://www.myproductionurl.com'
];
var corsOptions = {
    origin: function (origin, callback) {
        var isWhitelisted = originsWhitelist.indexOf(origin) !== -1;
        callback(null, isWhitelisted);
    },
    credentials: true
};
app.use(cors(corsOptions));

const allowCrossDomain = function (req, res, next) {

    var origin = req.headers.origin;

    if (originsWhitelist.indexOf(origin) > -1) {
        res.header('Access-Control-Allow-Origin', origin);
    }

    res.header('Access-Control-Allow-Methods', 'OPTIONS, GET, POST'); // added OPTIONS as an allowed method
    res.header('Access-Control-Allow-Headers', 'X-Requested-With,content-type,x-access-token');
    res.header('access-control-allow-credentials', true);

    return next();
}

app.use(allowCrossDomain)

您只需在后端(node/express)使用此代码即可:

var express=require('express'))
var cors=require('cors')
var app=express()
应用程序使用(cors)({
来源:[
'http://localhost:4200“,//这是我用于开发的前端url
'http://x.x.x.x:4200',
'http://www.myproductionurl.com'
]
}))
app.get(“/MyAPI端点”,函数(req,res,next){
res.json({消息:“此API端点已启用CORS”。})
})
应用程序侦听(3000,函数(){
console.log('在端口3000上侦听的启用CORS的web服务器')
})
在您的前端(角度):

this.http.get(`${this.apirl}/users/${type}`,{
标题:{
'Authorization':'Bearer${this.getToken()}`
}
);

关于
节点
express

的更多详细信息我从向rest api发出请求,请求能够返回200个响应,因此我意识到问题出在我的角度应用程序上。我所有的问题都是本地主机的APIRL。我向
本地主机:3000
发出请求,而不是
x.x.x:3000
。有点疏忽,但浪费了大量时间,所以我想回答自己的问题。

请以文本而不是图像的形式向我们展示相关的服务器代码。@jfriend00在那里它是访问控制允许-*在HTTP请求中不应该是必需的。你能接受
res.header('Access-Control-Allow-Origin','*');
或者让Origin按阶段配置吗(dev vs.prod)并明确设置一个原点?@DavidRenner我不明白。我甚至无法生活这就是问题所在我意识到问题完全不同。