【问题标题】:Enabling CORS in Cloud Functions for Firebase在 Cloud Functions for Firebase 中启用 CORS
【发布时间】:2017-08-02 23:12:56
【问题描述】:

我目前正在学习如何为 Firebase 使用新的 Cloud Functions,我遇到的问题是我无法访问通过 AJAX 请求编写的函数。我收到“无 'Access-Control-Allow-Origin'”错误。这是我写的函数的一个例子:

exports.test = functions.https.onRequest((request, response) => {
  response.status(500).send({test: 'Testing functions'});
})

该函数位于此网址中: https://us-central1-fba-shipper-140ae.cloudfunctions.net/test

Firebase 文档建议在函数中添加 CORS 中间件,我已经尝试过,但它不适合我:https://firebase.google.com/docs/functions/http-events

我就是这样做的:

var cors = require('cors');    

exports.test = functions.https.onRequest((request, response) => {
   cors(request, response, () => {
     response.status(500).send({test: 'Testing functions'});
   })
})

我做错了什么?我将不胜感激。

更新:

Doug Stevenson 的回答很有帮助。添加 ({origin: true}) 解决了这个问题,我还不得不将 response.status(500) 更改为 response.status(200),一开始我完全错过了。

【问题讨论】:

  • 也是文档中的示例here
  • 我有一些函数可以与所提供的解决方案一起使用,但现在我正在尝试一个新函数,它基本上将打开的图形添加到我的 index.html 顶部并返回更新后的 index.html,但我不能让它工作:(继续获得 ACCESS-CONTROL--- 错误
  • 像上面那样将传入的请求包装在 cors() 中是唯一对我有用的方法
  • 您可以编辑您的“更新”以强调需要 cors 中间件吗?这将为一些人节省一些时间

标签: javascript firebase google-cloud-platform cors google-cloud-functions


【解决方案1】:
  1. 进入您的Google Cloud Functions。您之前可能没有见过这个平台,但您可以通过它来解决这个 Firebase 问题。
  2. 找到您要搜索的 Firebase 函数并点击名称。如果此页面为空白,您可能需要搜索 Cloud Functions 并从结果中选择页面。
  3. 找到您的函数,点击名称。
  4. 转到权限选项卡。点击添加(添加用户)。
  5. 根据新原则,输入“allUsers”——它应该在您完成输入之前自动完成。
  6. 在选择角色下,搜索 Cloud Functions,然后选择 Invoker。
  7. 保存。
  8. 等几分钟。

这应该可以解决它。如果没有,请执行此操作并将 CORS 解决方案添加到您的函数代码中,例如:

  exports.sendMail = functions.https.onRequest((request, response) => {
  response.set("Access-Control-Allow-Origin", "*");
  response.send("Hello from Firebase!");
});

【讨论】:

  • 如果您不在函数内部自己处理身份验证,这不会让您的函数公开并可供任何人使用。
  • 对我来说,这就是让事情正常工作并挽救我的理智所需要的。我向后工作并从那里实施安全措施。如何处理超出了我要回答的范围,但值得一提。
【解决方案2】:

云功能日志记录有帮助,检查你是否卡住了。

我的问题原来是我的云函数上的类型错误,其中我有一个预期为字符串的数字:

TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received type number (1)

由于某种原因,这给了我前端的 cors 错误,并且浪费了几个小时。

【讨论】:

    【解决方案3】:

    更新答案:使用支持 Typescript 的 cors 库:

    安装cors

    npm i -S cors
    npm i --save-dev @types/cors
    

    index.ts:

    import * as cors from "cors";
    const corsHandler = cors({ origin: true });
    
    // allow cors in http function
    export const myFunction = functions.https.onRequest((req, res) => {
    corsHandler(req, res, async () => {
    
    // your method body
    
     });
    });
    

    旧答案: (不再工作)
    找到了一种无需导入任何“cors”库即可启用 cors 的方法。它也适用于Typescript,并在 chrome 版本 81.0 中对其进行了测试。

    exports.createOrder = functions.https.onRequest((req, res) => {
    // browsers like chrome need these headers to be present in response if the api is called from other than its base domain
      res.set("Access-Control-Allow-Origin", "*"); // you can also whitelist a specific domain like "http://127.0.0.1:4000"
      res.set("Access-Control-Allow-Headers", "Content-Type");
    
      // your code starts here
    
      //send response
      res.status(200).send();
    });
    

    【讨论】:

    • 这对我有用,添加res.set("Access-Control-Allow-Origin", "*");只是没有用res.set("Access-Control-Allow-Headers", "Content-Type");解决了我的问题
    • 这对我不起作用,因为它在 GET/POST 请求之前不支持 OPTIONS 方法“预检检查”。我不得不切换到cors 包(或重新创建OPTIONS 特殊响应,这最终比它的价值更麻烦)
    【解决方案4】:

    使用 Typescript 在您的 https.onRequest 上使用 cors,如下所示:

    import * as cors from 'cors';
    const corsHandler = cors({origin: true});
    
    export const pingFunctionWithCorsAllowed = functions.https.onRequest((request, response) => {
      corsHandler(request, response, () => {
        response.send(`Ping from Firebase (with CORS handling)! ${new Date().toISOString()}`);
      });
    });
    

    来自Source

    【讨论】:

      【解决方案5】:

      我收到错误是因为我正在调用客户端上不存在的函数。例如:

      firebase.functions().httpsCallable('makeSureThisStringIsCorrect');
      

      【讨论】:

        【解决方案6】:

        我已经尝试了很长时间。

        当我做出这个改变时,它终于奏效了。

        app.get('/create-customer', (req, res) => {
          return cors()(req, res, () => {
            ... your code ...
        

        最大的不同是我使用cors()(req, res...而不是直接使用cors(req, res...

        现在完美运行。

        【讨论】:

          【解决方案7】:

          我是 Firebase 的初学者(30 分钟前注册)。我的问题是我调用了我的端点

          https://xxxx-default-rtdb.firebaseio.com/myendpoint
          

          代替

          https://xxxx-default-rtdb.firebaseio.com/myendpoint.json
          

          如果您刚开始使用 Firebase,请确保不要忘记 .json 扩展。

          【讨论】:

            【解决方案8】:

            如果您更喜欢制作单个处理函数 (reference answer)

            const applyMiddleware = handler => (req, res) => {
              return cors(req, res, () => {
                return handler(req, res)
              })
            }
            exports.handler = functions.https.onRequest(applyMiddleware(handler))
            

            【讨论】:

            • 如果您可能需要添加更多处理程序或具有许多功能,这是一个理想的解决方案
            【解决方案9】:

            我对@Andreys 对他自己的问题的回答有一点补充。

            您似乎不必在cors(req, res, cb) 函数中调用回调,因此您只需调用函数顶部的 cors 模块,而无需在回调中嵌入所有代码。如果您想在之后实施 cors,这会快得多。

            exports.exampleFunction = functions.https.onRequest((request, response) => {
                cors(request, response, () => {});
                return response.send("Hello from Firebase!");
            });
            

            不要忘记在开篇文章中提到的初始化 cors:

            const cors = require('cors')({origin: true});

            更新:任何需要时间的响应函数都可能在此实现中出现 CORS 错误,因为它没有适当的 async/await。不要在返回静态数据的快速原型设计端点之外使用。

            【讨论】:

            • 当其他 SO 回答手动设置标题时,此方法有效
            • 这行得通,但如果您启用它并且无法部署到 Firebase,它可能会导致 TSlint 错误。将响应放入 cors 闭包中以克服它cors(request, response, () => { return response.send("Hello from Firebase!"); });
            • 这里有 2 个错误。第一。 cors 函数之后的任何内容都将运行两次(因为第一个请求是预检)。不好。其次,@SpiralOut 你的解决方案会让你失去对云函数的日志记录(非常糟糕)和正确的异步/等待功能,你可能会在回调中过早地结束函数内容。
            • 在去年学到了很多关于 gcf 的知识,我不会再推荐这个答案了。它对于快速原型可能很方便,但在实际生产案例中避免这种情况
            • @JaapWeijland 请更新您的答案,说明为什么这种方法对生产代码不利。最终,stackoverflow 中的所有(看似有效的)示例迟早都会投入生产......
            【解决方案10】:

            请参阅下文,了解我如何使用 CORS 设置 Express。

            “https://pericope.app”是我的 Firebase 项目的自定义域。

            看起来所有其他答案都推荐origin:true*

            我对是否允许所有来源犹豫不决,因为它会允许其他任何人访问该 API。如果您正在创建公共服务,那很好,但如果您对数据做任何事情,那是有风险的,因为它是一个特权环境。例如,此管理 SDK 会绕过您为 Firestore 或 Storage 设置的任何安全规则。

            //Express
            const express = require('express');
            const app = express();
            
            const cors = require('cors');
            app.use(cors({
              origin: 'https://pericope.app'
            }));
            

            【讨论】:

              【解决方案11】:

              通过大量搜索,我可以在同一个 firebase 文档中找到这个解决方案,只需在路径中实现 cors:

              import * as express from "express";
              import * as cors from "cors";
              
              
              const api = express();
              api.use(cors({ origin: true }));
              api.get("/url", function);
              

              链接 firebase 文档:https://firebase.google.com/docs/functions/http-events

              【讨论】:

                【解决方案12】:

                如果您没有在函数中发现错误,则可能会发生 cors 错误。我的建议是在你的 corsHandler 中实现 try catch

                const corsHandler = (request, response, handler) => {
                    cors({ origin: true })(request, response, async () => {
                        try {
                            await handler();
                        }
                        catch (e) {
                            functions.logger.error('Error: ' + e);
                            response.statusCode = 500;
                            response.send({
                                'status': 'ERROR' //Optional: customize your error message here
                            });
                        }
                    });
                };
                

                用法:

                exports.helloWorld = functions.https.onRequest((request, response) => {
                    corsHandler(request, response, () => {
                        functions.logger.info("Hello logs!");
                        response.send({
                            "data": "Hello from Firebase!"
                        });
                    });
                });
                

                感谢 stackoverflow 用户:Hoang TrinhYayo ArellanoDoug Stevenson

                【讨论】:

                • 很好的答案,但只有一点:至于错误的状态代码,而不是 500,我认为用 403 响应可能更好。这(大致)是规范建议的fetch.spec.whatwg.org/#http-responses。一般来说,恕我直言,从应用程序代码中发送 500 似乎不是最佳选择——因为这会让您更难区分应用程序代码抛出预期错误的情况与服务器/运行时代码遇到其他类型的情况内部故障(甚至可能在它执行您的应用程序代码之前)。
                • 感谢您的评论 :) 500 响应代码是因为不是与 cors 相关的错误,因为我认为使用状态代码 >= 500 而不是 403 更合适。做什么你觉得呢?
                • 我已经尝试了此页面上的几乎所有答案,这是唯一有效的答案。谢谢!
                • 我很高兴它成功了! :)
                【解决方案13】:

                Firebase 团队提供了两个 sample functions 来演示 CORS 的使用:

                第二个示例使用与您当前使用的不同的方式处理 cors。

                考虑像这样导入,如示例中所示:

                const cors = require('cors')({origin: true});
                

                你的函数的一般形式是这样的:

                exports.fn = functions.https.onRequest((req, res) => {
                    cors(req, res, () => {
                        // your function body here - use the provided req and res from cors
                    })
                });
                

                【讨论】:

                • 看起来这是定义允许访问的域白名单的地方?并设置origin: true 允许任何域访问? (npmjs.com/package/cors) @Doug Stevenson 你认为firebase 可以写一个关于客户端/服务器https 功能所需基础知识的文档吗?示例 repo 很好,但我们错过了这个额外的要求。
                • 致任何愿意在其后端添加 CORS 支持的人:请确保您了解后果以及如何正确配置它。 "origin: true" 很适合测试,但它违背了整个目的:)
                • 谷歌云功能不允许使用通配符来源:cloud.google.com/functions/docs/writing/…
                • 只是提醒大家像 Doug 出色地提到的那样仍在导入 cors,不要忘记像 Andrey 那样包装响应,否则它将不起作用!
                • 正如其他人所提到的,您能否更新您的答案以指出确实需要 cors 中间件?如果我们浏览您的答案,我们认为唯一需要的步骤就是写const cors = require('cors')({origin: true});,但事实并非如此
                【解决方案14】:

                使用 Google Cloud Console 仪表板的简单解决方案:

                1. 转到您的 GCP 控制台信息中心:

                https://console.cloud.google.com/home/dashboard

                1. 转到菜单

                “云函数”(“计算”部分)

                1. 选择您的云功能,例如“MyFunction”,右侧应该会出现一个侧边菜单,显示它的访问控制设置

                2. 点击“添加成员”,输入“allUsers”并选择角色“Cloud Function Invoker”

                3. 保存 -> 现在,您应该会在云功能列表中看到“允许未经身份验证”的备注

                现在每个人都可以通过正确的配置从互联网访问您的 GCP 或 Firebase 项目。 (小心

                【讨论】:

                  【解决方案15】:

                  添加我的经验。 我花了几个小时试图找出出现 CORS 错误的原因。

                  碰巧我重命名了我的云功能(我在大升级后尝试的第一个)。

                  因此,当我的 firebase 应用使用错误名称调用云函数时,它应该抛出 404 错误,而不是 CORS 错误。

                  在我的 firebase 应用中修复云函数名称解决了这个问题。

                  我已在此处填写了有关此问题的错误报告 https://firebase.google.com/support/troubleshooter/report/bugs

                  【讨论】:

                    【解决方案16】:

                    如果其他解决方案都不起作用,您可以尝试在调用开始时添加以下地址以启用 CORS - 重定向:

                    https://cors-anywhere.herokuapp.com/

                    带有 JQuery AJAX 请求的示例代码:

                    $.ajax({
                       url: 'https://cors-anywhere.herokuapp.com/https://fir-agilan.web.app/gmail?mail=asd@gmail.com,
                       type: 'GET'
                    });
                    

                    【讨论】:

                    • 这已经不可能了。
                    【解决方案17】:

                    true 更改为"*" 对我有用,所以它看起来像这样:

                    const cors = require('cors')({ origin: "*" })
                    

                    我尝试了这种方法,因为一般来说,这个响应头是这样设置的:

                    'Access-Control-Allow-Origin', '*'
                    

                    请注意,这将允许任何域调用您的端点,因此它不安全。

                    此外,您可以阅读以下文档的更多信息: https://github.com/expressjs/cors

                    【讨论】:

                      【解决方案18】:

                      在我的情况下,错误是由云函数调用程序限制访问引起的。请将 allUsers 添加到云函数调用程序。请抓住link。更多信息请参考article

                      【讨论】:

                      • 请在你的回答中提供一些链接材料的解释,为什么它是相关的等等
                      【解决方案19】:

                      你可以像这样在云函数中设置CORS

                      response.set('Access-Control-Allow-Origin', '*');

                      无需导入cors

                      【讨论】:

                      • 这非常适合我的情况,这是一个对 Mailchimp API 进行 XHR 调用的云函数。
                      • 谷歌云功能不允许使用通配符来源:cloud.google.com/functions/docs/writing/…
                      • @CoreyCole 我认为只有当您需要添加 Authorization 标头时。以上似乎工作正常。
                      • 我将该行添加到我的云函数中,但我的本地主机获取仍然被 CORS 策略阻止。
                      • @elersong 检查您的本地主机是否有http 而不是https
                      【解决方案20】:

                      如果你不/不能使用 cors 插件,首先在处理函数中调用 setCorsHeaders() 函数也可以。

                      回复时也使用 respondSuccess/Error 函数。

                      const ALLOWED_ORIGINS = ["http://localhost:9090", "https://sub.example.com", "https://example.com"]
                      
                      
                      // Set CORS headers for preflight requests
                      function setCorsHeaders (req, res) {
                        var originUrl = "http://localhost:9090"
                      
                      
                        if(ALLOWED_ORIGINS.includes(req.headers.origin)){
                          originUrl = req.headers.origin
                        }
                      
                        res.set('Access-Control-Allow-Origin', originUrl);
                        res.set('Access-Control-Allow-Credentials', 'true');
                      
                        if (req.method === 'OPTIONS') {
                          // Send response to OPTIONS requests
                          res.set('Access-Control-Allow-Methods', 'GET,POST','PUT','DELETE');
                          res.set('Access-Control-Allow-Headers', 'Bearer, Content-Type');
                          res.set('Access-Control-Max-Age', '3600');
                          res.status(204).send('');
                        }
                      }
                      
                      function respondError (message, error, code, res) {
                        var response = {
                          message: message,
                          error: error
                        }
                        res.status(code).end(JSON.stringify(response));
                      }
                      
                      
                      function respondSuccess (result, res) {
                        var response = {
                          message: "OK",
                          result: result
                        }
                        res.status(200).end(JSON.stringify(response));
                      }
                      

                      【讨论】:

                        【解决方案21】:

                        如果您在本地测试 firebase 应用程序,则需要将函数指向 localhost 而不是云。默认情况下,firebase servefirebase emulators:start 在您的 Web 应用程序上使用时将函数指向服务器而不是 localhost。

                        在 firebase 初始化脚本之后的 html 头中添加以下脚本:

                         <script>
                              firebase.functions().useFunctionsEmulator('http://localhost:5001')
                         </script> 
                        

                        确保在将代码部署到服务器时删除此 sn-p。

                        【讨论】:

                          【解决方案22】:

                          如果那里有像我这样的人:如果您想从与云功能本身相同的项目中调用云功能,您可以初始化 firebase sdk 并使用 onCall 方法。它会为你处理一切:

                          exports.newRequest = functions.https.onCall((data, context) => {
                              console.log(`This is the received data: ${data}.`);
                              return data;
                          })
                          

                          像这样调用这个函数:

                          // Init the firebase SDK first    
                          const functions = firebase.functions();
                          const addMessage = functions.httpsCallable(`newRequest`);
                          

                          Firebase 文档:https://firebase.google.com/docs/functions/callable

                          如果你不能在这里初始化 SDK 是其他建议的精髓:

                          【讨论】:

                          • 实际上,当我在浏览器上使用 onCall 函数时,我得到了 cors 错误。我可以在这个请求中设置成本头吗?
                          • 对于那些也遇到 onCall cors 错误的人,试试这个帖子:stackoverflow.com/q/50278537/1411473
                          【解决方案23】:

                          这可能会有所帮助。 我使用 express(自定义 URL)创建了 firebase HTTP 云函数

                          const express = require('express');
                          const bodyParser = require('body-parser');
                          const cors = require("cors");
                          const app = express();
                          const main = express();
                          
                          app.post('/endpoint', (req, res) => {
                              // code here
                          })
                          
                          app.use(cors({ origin: true }));
                          main.use(cors({ origin: true }));
                          main.use('/api/v1', app);
                          main.use(bodyParser.json());
                          main.use(bodyParser.urlencoded({ extended: false }));
                          
                          module.exports.functionName = functions.https.onRequest(main);
                          

                          请确保您添加了重写部分

                          "rewrites": [
                                {
                                  "source": "/api/v1/**",
                                  "function": "functionName"
                                }
                          ]
                          

                          【讨论】:

                          • 对于任何阅读本文并考虑将 express 放入其云功能的人 - 只是不要。启动 express 会占用额外的资源等,并且您已经实现了所有这些功能。 Firebase 函数!== 节点。
                          • 它可能真的会启动一个新的快速服务器每个请求。我真的不确定他们为什么在官方文档中有这些东西。
                          【解决方案24】:

                          只有这种方式对我有效,因为我的请求已获得授权:

                          exports.hello = functions.https.onRequest((request, response) => {
                          response.set('Access-Control-Allow-Origin', '*');
                          response.set('Access-Control-Allow-Credentials', 'true'); // vital
                          if (request.method === 'OPTIONS') {
                              // Send response to OPTIONS requests
                              response.set('Access-Control-Allow-Methods', 'GET');
                              response.set('Access-Control-Allow-Headers', 'Content-Type');
                              response.set('Access-Control-Max-Age', '3600');
                              response.status(204).send('');
                          } else {
                              const params = request.body;
                              const html = 'some html';
                              response.send(html)
                          } )};
                          

                          【讨论】:

                          【解决方案25】:

                          如果您不使用 Express 或只是想使用 CORS。以下代码将帮助解决

                          const cors = require('cors')({ origin: true, });   
                          exports.yourfunction = functions.https.onRequest((request, response) => {  
                             return cors(request, response, () => {  
                                  // *Your code*
                              });
                          });
                          

                          【讨论】:

                            【解决方案26】:

                            在将app 传递给onRequest 时,我遇到了同样的问题。我意识到这个问题是 firebase 函数的请求 url 上的斜杠。 Express 正在寻找 '/',但我在函数 [project-id].cloudfunctions.net/[function-name] 上没有斜杠。 CORS 错误是假阴性。当我添加斜杠时,我得到了预期的响应。

                            【讨论】:

                            • 还要确保添加您的[project-id],因为这是我面临的问题
                            【解决方案27】:

                            没有适合我的 CORS 解决方案...直到现在!

                            不确定其他人是否遇到了与我相同的问题,但我设置 CORS 的方式与我找到的示例不同,但似乎没有任何效果。我用 Plunker 建立了一个最小的例子,看看它是否真的是一个错误,但这个例子运行得很好。我决定检查 firebase 函数日志(在 firebase 控制台中找到),看看是否能告诉我任何信息。 我的节点服务器代码中有几个错误与 CORS 无关,当我调试时释放了我的 CORS 错误消息。我不知道为什么与 CORS 无关的代码错误会返回一个 CORS 错误响应,但它让我在错误的兔子洞里呆了好几个小时......

                            tl;dr - 如果没有 CORS 解决方案有效,请检查您的 firebase 函数日志并调试您遇到的任何错误

                            【讨论】:

                            • 这让我发疯了。就我而言,它甚至不是代码错误!它是Error: quota exceeded (Quota exceeded for quota group 'NetworkIngressNonbillable' and limit 'CLIENT_PROJECT-1d' of service 'cloudfunctions.googleapis.com ,所以基本上超出了免费配额并且函数返回了 cors 错误
                            • 这里发生了几次,服务器和cors都返回了同样的错误:错误:内部基本上是错误。如果您运行错误的函数,例如错误输入函数名称,也会发生此错误
                            • 当您尝试在云功能中请求 Google reCAPTCHA 验证时,浏览器也会向您抛出 CORS 错误。当我检查 Firebase 控制台功能日志时,它显示access to external network resources not allowed if the billing account is not enabled。启用计费帐户后,它可以完美运行。这也是与 cors 无关的示例之一,但会引发 cors 错误。
                            • 在我的情况下,问题是在运行模拟器之前我没有在正确的 Firebase 项目(命令行上的firebase use &lt;project-name&gt;)下登录。
                            【解决方案28】:

                            对于任何尝试在 Typescript 中执行此操作的人,代码如下:

                            import * as cors from 'cors';
                            const corsHandler = cors({origin: true});
                            
                            export const exampleFunction= functions.https.onRequest(async (request, response) => {
                                   corsHandler(request, response, () => {});
                                   //Your code here
                            });
                            

                            【讨论】:

                            • 解决方案会让你失去对云函数的日志记录(非常糟糕)和正确的异步/等待功能,你可能会在长时间调用的回调中过早结束函数内容。
                            • 谷歌云功能不允许使用通配符来源:cloud.google.com/functions/docs/writing/…
                            • @YayoArellano,谢谢。您的回答对我有所帮助,但我做了一点改动:corsHandler(request, response, () =&gt; { YOUR CODE HERE });
                            • @OliverDixon 你有没有更好的解决方案,它没有可能冒着函数内容在长时间调用期间过早结束的风险?可能将它包装在一个仅在回调“完成”后才解析的 Promise 中?
                            • @OliverDixon 你能解释一下“你有可能在长时间调用的回调中过早结束函数内容。”请问?
                            【解决方案29】:

                            另外一条信息,只是为了那些在一段时间后谷歌搜索的人: 如果您使用的是 firebase 托管,您还可以设置重写,以便例如 (firebase_hosting_host)/api/myfunction 之类的 url 重定向到 (firebase_cloudfunctions_host)/doStuff 函数。这样,由于重定向是透明的并且是服务器端的,因此您不必处理 cors。

                            您可以使用 firebase.json 中的 rewrites 部分进行设置:

                            "rewrites": [
                                    { "source": "/api/myFunction", "function": "doStuff" }
                            ]
                            

                            【讨论】:

                            • imo,这是最好的答案,因为它解决了实际问题,而不会增加任何额外的安全问题。通过这种方式,云功能与其他功能从同一个域提供服务,您甚至不需要任何 cors。
                            • 这确实是一个很棒的功能,但它目前仅在函数位于默认区域 (us-central1) 时才有效。由于延迟原因,我想将我的功能部署到 europe-west1 并遇到了这个问题:github.com/firebase/firebase-tools/issues/842
                            • 重定向工作正常并使 URL 更清晰,但我还没有弄清楚如何传递 GET 参数。该函数(重写后)似乎是在没有参数的情况下调用的。
                            • 使用 Firebase 托管?如果是,那么您的云功能必须位于“us-central1”区域,这在 2021 年 6 月仍然如此。
                            • 如果有人好奇,这里是文档的链接:firebase.google.com/docs/hosting/full-config#rewrite-functions
                            【解决方案30】:

                            我刚刚发表了一篇关于此的文章:

                            https://mhaligowski.github.io/blog/2017/03/10/cors-in-cloud-functions.html

                            通常,您应该使用 Express CORS package,这需要稍微修改一下才能满足 GCF/Firebase 函数的要求。

                            希望有帮助!

                            【讨论】:

                            • 不知道你所说的黑客是什么意思?想详细说明一下吗?阅读您的帖子,但我没有看到您提到它
                            • 这里是 cors 模块的作者; “hacking” mhaligowski 仅仅意味着他必须包装对 cors 模块的调用,以使其与 Express 调用中间件的方式相匹配(即在 req & res 之后提供一个函数作为第三个参数)
                            • 该链接已损坏mhaligowski.github.io/blog/2017/03/10/… 这就是为什么最好放置外部资源的内容(摘要)而不是外部链接
                            猜你喜欢
                            • 2016-06-12
                            • 2021-08-14
                            • 1970-01-01
                            • 2018-01-14
                            • 2017-09-07
                            • 2018-01-03
                            • 2022-12-01
                            • 2018-03-04
                            • 2017-08-07
                            相关资源
                            最近更新 更多