46

我刚刚完成了 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 标头以便能够从我的网站调用我的函数?

4

9 回答 9

81

开始了:

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))
于 2017-04-14T19:51:54.550 回答
26

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

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

更新:

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

于 2016-03-18T04:42:14.383 回答
7

您可以使用 CORS express 中间件。

包.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);
于 2017-04-03T01:48:17.407 回答
5

我刚刚创建了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"
  }
}

希望这可以帮助。

于 2017-08-04T09:42:31.147 回答
3

在python环境中,可以使用flask request对象来管理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 文档

于 2018-12-08T20:39:18.313 回答
3

您需要通过设置其标头来发送'OPTIONS'响应,如下所示:

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

运行时:NodeJS 10

于 2021-01-21T07:03:13.453 回答
3

如果您尝试了接受的答案但遇到了预检错误,则文档提供了以多种语言处理它的示例,但需要注意的是它仅适用于公共功能,即部署为--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");
};
于 2021-03-05T14:43:16.110 回答
1

您必须在所有函数中启用 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

包.json

{
  "name": "function-hello",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "cors": "^2.8.5"
  }
}
于 2019-10-02T09:51:41.583 回答
1

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

于 2021-08-06T15:29:58.523 回答