Google Cloud Functions 启用 CORS?

Posted

技术标签:

【中文标题】Google Cloud Functions 启用 CORS?【英文标题】:Google Cloud Functions enable CORS? 【发布时间】:2016-06-12 03:36:14 【问题描述】:

我刚刚完成了 Hello World Google Cloud Functions 教程并收到了以下响应标头:

Connection → keep-alive
Content-Length → 14
Content-Type → text/plain; charset=utf-8
Date → Mon, 29 Feb 2016 07:02:37 GMT
Execution-Id → XbT-WC9lXKL-0
Server → nginx

如何添加 CORS 标头以便能够从我的网站调用我的函数?

【问题讨论】:

【参考方案1】:

我是 Google Cloud Functions 的产品经理。感谢您的提问,这是一个很受欢迎的请求。

我们目前还没有任何要宣布的内容,但我们知道需要对 Cloud Functions 的 HTTP 调用功能进行几项增强,我们将在这方面和许多其他领域推出改进未来的迭代。

更新:

我们改进了您在 Cloud Functions 中处理 HTTP 的方式。您现在拥有对 HTTP 请求/响应对象的完全访问权限,因此您可以设置适当的 CORS 标头并响应飞行前 OPTIONS 请求 (https://cloud.google.com/functions/docs/writing/http)

【讨论】:

提供的链接 (cloud.google.com/functions/docs/writing/http) 没有提及任何关于 cors 的内容。有没有官方文档可以看?我希望会有一个 UI 来更改这些设置(法律),但似乎没有。 beta python 环境是否支持CORS? Python 环境使用 Flask 作为其 Web 框架,因此您应该能够使用标准 Flask 语义手动设置 CORS 标头。我们正在逐渐在缺少的地方添加 python 示例,这就是其中之一。在此处讨论的 Flask 中设置标题:***.com/questions/29464276/… 这里的文档相当混乱。 ttps://firebase.google.com/docs/functions/http-events 。和快递有什么关系?【参考方案2】:

您可以使用 CORS express 中间件。

package.json

npm install express --save
npm install cors --save

index.js

'use strict';

const functions = require('firebase-functions');
const express = require('express');
const cors = require('cors')(origin: true);
const app = express();

app.use(cors);
app.get('*', (req, res) => 
    res.send(`Hello, world`);
);

exports.hello = functions.https.onRequest(app);

【讨论】:

【参考方案3】:

我们开始:

exports.helloWorld = function helloWorld(req, res)   
  res.set('Access-Control-Allow-Origin', "*")
  res.set('Access-Control-Allow-Methods', 'GET, POST');

  if (req.method === "OPTIONS") 
    // stop preflight requests here
    res.status(204).send('');
    return;
  

  // handle full requests
  res.status(200).send('weeee!);
;

然后你可以像往常一样使用 jquery/whatever 它:

$.get(myUrl, (r) => console.log(r))

【讨论】:

我已经尝试了上述实现,但我收到:请求标头字段 X-Requested-With 在预检响应中被 Access-Control-Allow-Headers 不允许。有什么建议吗? 在发送响应之前尝试添加 res.set('Access-Control-Allow-Headers', 'Content Type', 'X-Requested-Width', '...') It does not have HTTP ok status. 如何在 python 运行时做同样的事情? @bikram cloud.google.com/functions/docs/writing/…【参考方案4】:

我刚刚创建了webfunc。它是一个轻量级 HTTP 服务器,支持 CORS 以及 Google Cloud Functions 的路由。示例:

const  serveHttp, app  = require('webfunc')

exports.yourapp = serveHttp([
  app.get('/', (req, res) => res.status(200).send('Hello World')),
  app.get('/users/userId', (req, res, params) => res.status(200).send(`Hello user $params.userId`)),
  app.get('/users/userId/document/docName', (req, res, params) => res.status(200).send(`Hello user $params.userId. I like your document $params.docName`)),
])

在您项目的根目录中,只需添加如下所示的 appconfig.json


  "headers": 
    "Access-Control-Allow-Methods": "GET, HEAD, OPTIONS, POST",
    "Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept",
    "Access-Control-Allow-Origin": "*",
    "Access-Control-Max-Age": "1296000"
  

希望这会有所帮助。

【讨论】:

【参考方案5】:

在python环境下,可以使用flask request object来管理CORS请求。

def cors_enabled_function(request):
    if request.method == 'OPTIONS':
        # Allows GET requests from any origin with the Content-Type
        # header and caches preflight response for an 3600s
        headers = 
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Methods': 'GET',
            'Access-Control-Allow-Headers': 'Content-Type',
            'Access-Control-Max-Age': '3600'
        

        return ('', 204, headers)

    # Set CORS headers for the main request
    headers = 
        'Access-Control-Allow-Origin': '*'
    

    return ('Hello World!', 200, headers)

请参阅gcloud docs 了解更多信息。

【讨论】:

【参考方案6】:

您必须在所有函数中启用 CORS,例如 hello 函数:

index.js

const cors = require('cors')();

// My Hello Function
function hello(req, res) 
  res.status(200)
    .send('Hello, Functions');
;

// CORS and Cloud Functions export
exports.hello = (req, res) => 
  cors(req, res, () => 
    hello(req, res);
  );

不要忘记 package.json

package.json


  "name": "function-hello",
  "version": "0.1.0",
  "private": true,
  "dependencies": 
    "cors": "^2.8.5"
  

【讨论】:

【参考方案7】:

您需要发送'OPTIONS' 响应,方法是设置其标头如下:

if (req.method === 'OPTIONS') 
  res.set('Access-Control-Allow-Methods', '*');
  res.set('Access-Control-Allow-Headers', '*');
  res.status(204).send('');

运行时:NodeJS 10

【讨论】:

这是一个预检请求处理程序。有关更深入的解释,请参阅the docs。【参考方案8】:

如果您尝试了accepted answer,但遇到了预检错误,docs 提供了以多种语言处理它的示例,caveat 仅适用于公共功能,即使用--allow-unauthenticated 部署:

exports.corsEnabledFunction = (req, res) => 
  res.set("Access-Control-Allow-Origin", "*");

  if (req.method === "OPTIONS") 
    /* handle preflight OPTIONS request */
    
    res.set("Access-Control-Allow-Methods", "GET, POST");
    res.set("Access-Control-Allow-Headers", "Content-Type");

    // cache preflight response for 3600 sec
    res.set("Access-Control-Max-Age", "3600");
    
    return res.sendStatus(204);
  

  // handle the main request
  res.send("main response");
;

【讨论】:

注意:原始答案后 6 个月:已接受的答案已被编辑以处理 CORS,但我将把它留给后代,因为它看起来更清晰。【参考方案9】:

从此处应用您最喜欢的答案后,如果您仍然收到此错误,请检查您的云函数中是否存在未捕获的错误。这可能会导致浏览器收到 CORS 错误,即使您的错误与 CORS 无关

【讨论】:

以上是关于Google Cloud Functions 启用 CORS?的主要内容,如果未能解决你的问题,请参考以下文章

具有 Google Cloud Functions 的 Google Cloud Endpoints [关闭]

? Google Cloud Functions ?????? MongoDB Atlas ??

Google Cloud Functions 部署问题

如何从 Cloud Functions 连接 Google Cloud SQL?

Google Cloud Functions 通知 iOS

Google Cloud Functions Cron 作业不工作