Google Cloud Functions 支持 CORS?
Google Cloud Functions enable CORS?
我刚刚完成 Hello World Google Cloud Functions 教程并收到以下响应 headers:
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 headers 以便能够从我的网站调用我的函数?
我是 Google Cloud Functions 的产品经理。感谢您的提问,这是一个很受欢迎的问题。
我们目前还没有任何要宣布的消息,但我们知道需要对 Cloud Functions 的 HTTP 调用功能进行多项增强,并且我们将推出对此和许多其他方面的改进未来迭代中的领域。
更新:
我们改进了您在 Cloud Functions 中处理 HTTP 的方式。您现在可以完全访问 HTTP Request/Response objects,因此您可以设置适当的 CORS headers 并响应 pre-flight OPTIONS 请求 (https://cloud.google.com/functions/docs/writing/http)
您可以使用 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);
我们开始:
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))
我刚刚创建了 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"
}
}
希望对您有所帮助。
在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。
您必须在所有函数中启用 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"
}
}
您需要通过如下设置 header 来发送 'OPTIONS'
响应:
if (req.method === 'OPTIONS') {
res.set('Access-Control-Allow-Methods', '*');
res.set('Access-Control-Allow-Headers', '*');
res.status(204).send('');
}
运行时:NodeJS 10
如果您尝试了 but encountered a preflight error, the docs offer examples of handling it in multiple languages, with the caveat,它仅适用于 public 函数,即使用 --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");
};
从此处应用您最喜欢的答案后,如果您仍然收到此错误,请检查您的云函数中是否存在未捕获的错误。这可能导致浏览器收到 CORS 错误,即使您的错误与 CORS
无关
我刚刚完成 Hello World Google Cloud Functions 教程并收到以下响应 headers:
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 headers 以便能够从我的网站调用我的函数?
我是 Google Cloud Functions 的产品经理。感谢您的提问,这是一个很受欢迎的问题。
我们目前还没有任何要宣布的消息,但我们知道需要对 Cloud Functions 的 HTTP 调用功能进行多项增强,并且我们将推出对此和许多其他方面的改进未来迭代中的领域。
更新:
我们改进了您在 Cloud Functions 中处理 HTTP 的方式。您现在可以完全访问 HTTP Request/Response objects,因此您可以设置适当的 CORS headers 并响应 pre-flight OPTIONS 请求 (https://cloud.google.com/functions/docs/writing/http)
您可以使用 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);
我们开始:
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))
我刚刚创建了 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"
}
}
希望对您有所帮助。
在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。
您必须在所有函数中启用 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"
}
}
您需要通过如下设置 header 来发送 'OPTIONS'
响应:
if (req.method === 'OPTIONS') {
res.set('Access-Control-Allow-Methods', '*');
res.set('Access-Control-Allow-Headers', '*');
res.status(204).send('');
}
运行时:NodeJS 10
如果您尝试了 --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");
};
从此处应用您最喜欢的答案后,如果您仍然收到此错误,请检查您的云函数中是否存在未捕获的错误。这可能导致浏览器收到 CORS 错误,即使您的错误与 CORS
无关