node.js - express 和 CORS 的问题
问题描述
我正在使用 express 运行 nodejs 脚本。我已阅读文档,但仍无法发出 CROS 请求。我正在运行一个网络服务器来显示它是如何不工作的: http: //a56f1bae.ngrok.io/
我真的不知道为什么它不起作用,它几乎与文档中的完全一样。
如果有帮助,这是我的脚本:
var express = require('express');
var app = express();
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Origin', "*");
res.header('Access-Control-Allow-Methods','GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'Content-Type');
next();
})
app.get('*', function (req, res) {
res.send(html);
});
app.listen(3000, function () {
console.log('Server running on port 3000');
});
var html = `
<html>
<head>
<script>
var url = 'https://suggestqueries.google.com/complete/search?output=firefox&hl=en&q=test';
var request = new XMLHttpRequest();
if('withCredentials' in request) {
// Firefox 3.5 and Safari 4
try{
request.open('GET', url, false);
request.send();
document.write('It is doing fine!');
} catch (err){
document.write(err)
}
} else if (XDomainRequest) {
// IE8
try{
var xdr = new XDomainRequest();
xdr.open('get', url);
xdr.send();
document.write('It is doing fine!');
} catch (err){
document.write(err)
}
// handle XDR responses -- not shown here :-)
}
</script>
</head>
</html>
`;
非常感谢,如果我的问题很明显,我很抱歉。
解决方案
我认为你有一个概念问题。
您必须将 cors 标头设置为 SERVER 而不是 CLIENT。
您想suggestqueries.google.com
从localhost:3000
. 这意味着在这种情况下服务器是服务器是 google.com 或者我猜google API
。这意味着您需要在 google api 中设置 cors。
如果假设您有一个可以作为 api 服务运行localhost:someport
并访问的应用程序,那么您需要将 cors 添加到您的 Express 应用程序中。localhost:3000
因为那时它将是您的服务器。
看看这个:https ://developers.google.com/api-client-library/javascript/features/cors
注意:出于开发目的,您可以在 chrome 中禁用同源策略。请参阅此处了解如何执行此操作:在 Chrome 中禁用同源策略
编辑:一种解决方法
由于谷歌建议的文档很少,您可以使用它jsonp
来克服 cors 问题。检查:使用 JsonP 的 JavaScript XMLHttpRequest
而是XMLHttpRequest
尝试使用jsonp
@paul 创建的函数
function jsonp(url, callback) { var callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random()); window[callbackName] = function(data) { delete window[callbackName]; document.body.removeChild(script); callback(data); }; var script = document.createElement('script'); script.src = url + (url.indexOf('?') >= 0 ? '&' : '?') + 'callback=' + callbackName; document.body.appendChild(script); } jsonp('http://www.helloword.com', function(data) { alert(data); });
推荐阅读
- maven - Gitlab CI在部署阶段没有后台JAR文件
- javascript - 在 Shadow DOM 的 CSS 中从 Light DOM 访问全局状态
- javascript - Node.js IF 语句由于某种原因不起作用
- java - Android 通知生成器声音不运行
- asp.net-core - 用于 ASP.NET Core 中托管的 Angular 的 URL 重写的 Web.config 文件 IIS 规则无法按预期工作
- c - 我可以在没有额外编译步骤的情况下定义库所需的 C extern 函数吗?
- html - CSS html图像不堆叠
- flutter - 我怎样才能复制这个设计?
- mysql - Laravel 过滤整个集合或使用范围
- python - URL http://localhost:8000/admin/ 重定向到错误页面