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

时间:2018-07-06 21:10:09

标签: 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.get('/api', (req, res) => {
  res.send('Hello');
});

exports.api = functions.https.onRequest(app);

并有4条关于的错误:
http://localhost:3000被Access-Control-Allow-Origin禁止。

我还尝试了其他一些类似的方法:

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);

给我同样的错误。
我正在使用Firebase Cloud Function部署此api,因为代码是如此简单,以至于我真的无法弄清楚哪个部分做得不好。

1 个答案:

答案 0 :(得分:1)

CORS始终是一个棘手的情况,但是在这种情况下,我想我可以提供帮助。运行firebase deploy时,应该看到端点已部署。如果是第一次部署该功能,则应在控制台中打印出该新功能的完整URL,通常看起来像这样:

https://us-central1-your-project-name.cloudfunctions.net/apiEndpointName

如果已经部署了该功能,则可以在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命令/配置,在这种情况下,位于名为“ rewrites”的部分下,如下所示:

{
  "hosting": {
    "public": "public",

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

  }
}

查看this documentation link并说明所有内容^^

完成此操作后,请重新部署所有内容,现在您应该可以在浏览器中访问/api并触发该功能。 注意,除非您使用firebase serve,否则应在部署的网站而非本地主机上访问该路由。在firebase serve上检出this link for more details