首页 > 解决方案 > 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>
`;

非常感谢,如果我的问题很明显,我很抱歉。

标签: node.jsexpresscors

解决方案


我认为你有一个概念问题。

您必须将 cors 标头设置为 SERVER 而不是 CLIENT。
您想suggestqueries.google.comlocalhost: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);
});

推荐阅读