Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 在使用node.js和Express构建的api中使用CORS中间件时出现CORS错误_Firebase_Express_Cors_Google Cloud Functions - Fatal编程技术网

Firebase 在使用node.js和Express构建的api中使用CORS中间件时出现CORS错误

Firebase 在使用node.js和Express构建的api中使用CORS中间件时出现CORS错误,firebase,express,cors,google-cloud-functions,Firebase,Express,Cors,Google Cloud Functions,我不熟悉node和express。我在构建非常简单的API时遇到了cors错误。我试了几个小时用不同的方法来解决这个问题,但都不管用 这是我的方法 const functions = require('firebase-functions'); const express = require('express'); const cors = require('cors'); const app = express(); app.use(cors({ origin: true })); app

我不熟悉node和express。我在构建非常简单的API时遇到了cors错误。我试了几个小时用不同的方法来解决这个问题,但都不管用

这是我的方法

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

app.use(cors({ origin: true }));

app.get('/api', (req, res) => {
  res.send('Hello');
});

exports.api = functions.https.onRequest(app);
得到了四个错误:
是访问控制允许源不允许的

我还尝试了其他几种类似的方法:

var allowCrossDomain = function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Cache-Control");
    next();
};
app.use(allowCrossDomain);
https://us-central1-your-project-name.cloudfunctions.net/apiEndpointName
{
  "hosting": {
    "public": "public",

    // Add the following rewrites section *within* "hosting"
    "rewrites": [ {
      "source": "/bigben", "function": "bigben"
    } ]

  }
}
这给了我同样的错误。

我使用Firebase Cloud函数来部署此api,因为代码太简单了,所以我真的无法确定哪一部分做得不对。

CORS始终是一个棘手的问题,但在这种情况下,我想我可能能够提供帮助。运行
firebase deploy
时,您应该会看到您的端点已部署。如果是您第一次部署该函数,它应该在控制台中打印出该新函数的完整URL,通常如下所示:

var allowCrossDomain = function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Cache-Control");
    next();
};
app.use(allowCrossDomain);
https://us-central1-your-project-name.cloudfunctions.net/apiEndpointName
{
  "hosting": {
    "public": "public",

    // Add the following rewrites section *within* "hosting"
    "rewrites": [ {
      "source": "/bigben", "function": "bigben"
    } ]

  }
}
如果您已经部署了它,您可以在Firebase控制台->函数->仪表板中看到函数的完整URL

该URL是该函数的普通公共API端点或“HTTP触发器”。如果您想使用Postman向该URL发出GET请求,您应该期望收到您的
Hello
响应。(或者,如果您在浏览器中访问了该URL,您的浏览器将向该URL发出GET请求,您也应该在那里获得您的
Hello
响应)

当您希望从部署/托管的网站访问它时,就会出现问题。您需要告诉Firebase的托管部分将
/api
的任何流量路由到您的函数-您的Firebase托管应该而不是尝试将
/api
路由解析为一个普通HTML页面,该页面部署在主index.HTML文件旁边。。。相反,它应该将
/api
的任何流量定向到云函数
api

因此,您需要告诉Firebase将
/api
的任何流量定向到云函数,而不是托管。您可以在
Firebase.json
文件中提供Firebase命令/配置。。。在本例中,在名为“重写”的部分下,如下所示:

var allowCrossDomain = function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Cache-Control");
    next();
};
app.use(allowCrossDomain);
https://us-central1-your-project-name.cloudfunctions.net/apiEndpointName
{
  "hosting": {
    "public": "public",

    // Add the following rewrites section *within* "hosting"
    "rewrites": [ {
      "source": "/bigben", "function": "bigben"
    } ]

  }
}
看看它是怎么解释的^^

完成后,重新部署所有内容,现在您应该能够在浏览器中访问
/api
,并触发该函数注意除非您使用的是
firebase Service
,否则您应该访问已部署网站上的路由,而不是本地主机。查看
firebase Service