对预检请求的响应没有通过访问控制检查:否'访问控制 - 允许 - 来源'标头出现在请求的资源上。

时间:2017-11-22 10:05:13

标签: node.js express cors fetch

我正在使用nodejs服务器,表达框架和获取库来向另一个域中的另一个服务器发送请求。对于我的一个端点考虑(localhost:8080 / login)我在用户单击登录按钮时呈现ejs文件我正在向其他域中的api(https:otherserver.com/login)不同服务器发送获取请求。我无法发送此请求。我收到了这个错误:

对预检请求的响应没有通过访问控制检查:否'访问控制 - 允许 - 来源'标头出现在请求的资源上。起源' http://localhost:8080'因此不允许访问。响应具有HTTP状态代码404.如果不透明响应满足您的需求,请将请求的模式设置为“无人”状态'在禁用CORS的情况下获取资源。

我不知道如何处理这个问题。请提出一些可以解决这个问题的想法或链接。

2 个答案:

答案 0 :(得分:2)

您可以在服务器上使用cors中间件。

最简单的使用方法是添加:

app.use(cors())

在所有路线处理程序之前。

答案 1 :(得分:1)

我找到了解决问题的方法。我试图解释我所理解的,因为我是服务器端和Web开发的初学者。

这是我遇到的问题: 对于我的nodejs服务器中的一个端点,考虑(localhost:8080 / login)当用户单击该ejs文件中的登录按钮时,我正在呈现ejs文件,我正在向api发送获取请求(https:otherserver.com/登录)在其他域的不同服务器。我无法发送此请求。我遇到了问题。

出现Cors问题是因为呈现ejs文件的服务器域(我的nodejs服务器)和我在点击登录按钮后获取请求的其他域(h​​ttps:otherserver.com/signin)不同。

所以解决方案是:

我需要首先将获取请求发送到同一个域(我的nodejs服务器localhost:8080 / api / signin)。然后从这个服务器我应该调用其他域的api(https:otherserver.com/signin)。通过这样做,我们不会得到任何cors问题。因为客户端ejs文件正在请求已呈现该文件的同一服务器。然后服务器绕过对其他服务器的请求。

来自客户端javascript文件的代码。 / api / signin是我本地nodejs服务器中的端点,你可以添加选项:

options ={
    method : 'POST',
    headers : {
         'Accept': 'application/json',
        'Content-Type': 'application/json'
       }

    body : JSON.stringify({
        email_address : emailId,
        password : pwd
    })
};

fetch("/api/signin",options)
.then(function(res) {
    console.log(res);
}).catch(function(error) {
   console.log(error); 
}); 

来自本地nodejs服务器端的代码:

express.use('/api/', function (req, res, next) {
     var options = {
        method : req.method,
        headers :req.headers,
        body : JSON.stringify(req.body)
    }; 

    fetch('https://otherserver.com'+req.path,options)
    .then(response => {         
        return response.json();
    }, error => { console.error(error)})
    .then(function(json){
        res.send(json);
    })
    .catch(function(error) { 
       res.send(error); 
    });

})

希望这可以帮助那些初学者进行服务器开发。