Облачные функции Google позволяют использовать CORS?

Я только что закончил учебник облачных функций Hello World Google и получил следующие заголовки ответов:

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

здесь мы идем:

exports.helloWorld = function helloWorld(req, res) {  
  res.set('Access-Control-Allow-Origin', "*")
  res.set('Access-Control-Allow-Methods', 'GET, POST')
  res.status(200).send('weeee!);
};

то вы можете использовать jquery/как обычно:

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

Ответ 2

Я менеджер продуктов для облачных функций Google. Спасибо за ваш вопрос, это был популярный запрос.

Нам пока ничего не объявлено, но мы знаем о нескольких улучшениях, которые необходимо внести в возможности HTTP-вызовов функций Cloud, и мы будем внедрять усовершенствования для этого и многих других областей в будущие итерации.

ОБНОВЛЕНИЕ:

Мы улучшили способ работы с HTTP в облачных функциях. Теперь у вас есть полный доступ к объектам HTTP-запроса/ответа, поэтому вы можете установить соответствующие заголовки CORS и ответить на запросы перед полетом OPTIONS (https://cloud.google.com/functions/docs/writing/http)

Ответ 4

Я только что создал webfunc. Это легкий HTTP-сервер, который поддерживает CORS, а также маршрутизацию для облачных функций Google. Пример:

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

Вы можете использовать промежуточное ПО 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);

Ответ 7

В среде python вы можете использовать объект запроса фляги для управления запросами 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 больше.

Ответ 8

Вы должны включить 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"
  }
}