我使用nodejs服务器、express框架和fetch库将请求发送到另一个位于不同域的服务器。对于我的一个endpoint,请考虑(localhost:8080/login),当用户单击登录按钮时,我正在呈现ejs文件,我正在向另一个域中的不同服务器(https://otherserver.com/login)发送获取请求。我无法发送此请求。我收到此错误:
飞行前请求的响应未通过访问控制检查:请求的资源上不存在“access control Allow Origin”标头。原点'http://localhost:8080因此不允许访问。响应的HTTP状态代码为404。如果不透明的响应满足您的需求,请将请求的模式设置为“no cors”,以获取禁用cors的资源。
我不知道如何处理这个问题。请建议一些可以解决这个问题的想法或链接。
您可以在服务器上使用cors中间件。
最简单的使用方法是添加:
app.use(cors())
在所有路由处理程序之前。
我找到了我的问题的解决方案。我试图解释我所理解的,因为我是服务器端和 Web 开发的初学者。
这是我面临的问题:对于我的nodejs服务器中的一个endpoint,考虑(localhost:8080/login)当用户单击ejs文件中的登录按钮时,我正在呈现ejs文件,我正在向位于其他域中的不同服务器的API(https:other server . com/sign in)发送获取请求。我无法发送此请求。我遇到了cors问题。
发生Cors问题是因为呈现ejs文件的服务器域(我的nodejs服务器)和我在单击登录按钮后发出获取请求的另一个域(https:otherserver.com/signin)不同。
所以解决方案是:
我需要首先向同一域发出获取请求(我的nodejs服务器localhost:8080 / api/signin)。然后从这个服务器,我应该调用其他域的api(https:otherserver.com/signin)。通过这样做,我们不会遇到任何cors问题。因为客户端 ejs 文件正在请求呈现该文件的同一服务器。然后服务器绕过对另一台服务器的请求。
来自客户端javascript文件的代码/api/sign是本地nodejs服务器中的一个endpoint,您可以添加选项:
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);
});
来自本地节点js服务器端的代码:
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);
});
})
希望这对服务器开发初学者有所帮助。