对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。

Raj*_*tty 5 fetch node.js cors express

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

对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问Origin ' http://localhost:8080 '。响应的 HTTP 状态代码为 404。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以在禁用 CORS 的情况下获取资源。

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

Sel*_*jwa 5

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

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

app.use(cors())

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


Raj*_*tty 2

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

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

发生Cors问题是因为呈现ejs文件的服务器域(我的nodejs服务器)和我在单击登录按钮后发出获取请求的另一个域(https:otherserver.com/signin)不同。

所以解决方案是:

我需要首先向同一个域(我的nodejs服务器本地主机: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); 
}); 
Run Code Online (Sandbox Code Playgroud)

来自本地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); 
    });

})
Run Code Online (Sandbox Code Playgroud)

希望这可以对服务器开发初学者有所帮助。