node.js - 云功能和 Firebase 的客户端 CORS 错误
问题描述
我是 firebase 新手,想使用他们的 HTTP 云功能。当我尝试转到任何端点(不使用模拟器 - 例如https://us-central1-xxxxxxxx.cloudfunctions.net/app/api/admin/studio)时,我收到了 CORS 错误。
这是我的代码示例。我目前没有设置安全规则(仍在开发中)。下面的代码在使用 firebase 模拟器时完美运行。只是不使用“实时” .cloudfunctions 链接。
是否有我缺少的权限或设置?如果您通过浏览器或 POSTMAN 直接访问此端点,则此端点有效,而不是从 react 应用程序访问。
来自反应应用程序的错误示例是:
Origin https://xxxxxxxxxxx is not allowed by Access-Control-Allow-Origin.
Fetch API cannot load https://us-central1-xxxxxxxx.cloudfunctions.net/app/api/admin/studio due to access control checks.
index.js
const functions = require("firebase-functions")
const express = require("express")
const app = express()
const cors = require("cors")({ origin: true })
app.use(cors)
const studio = require("./http/studio.js")
app.post("/api/admin/studio", studio.add)
exports.app = functions.https.onRequest(app)
数据库.js
const admin = require("firebase-admin")
admin.initializeApp()
module.exports = admin.firestore()
http/studio.js
const db = require("../db")
const error = require("./error")
exports.add = (req, res) => {
const { data } = req.body
if (!data) {
return error.no_data(res)
}
return db
.collection("data")
.doc("studio")
.update({ values: admin.firestore.FieldValue.arrayUnion(data) })
.then(res.status(200).send("Data updated successfully"))
.catch(err => error.updating(res, err))
}
解决方案
我能够通过更新我的 index.js 代码以包含允许的来源列表来修复。
const functions = require("firebase-functions")
const express = require("express")
const app = express()
const cors = require("cors")({ origin: true })
var allowedOrigins = ["https://domainone", "https://domaintwo"]
app.use(
cors({
origin: function(origin, callback) {
if (!origin) return callback(null, true)
if (allowedOrigins.indexOf(origin) === -1) {
var msg = "The CORS policy for this site does not " + "allow access from the specified Origin."
return callback(new Error(msg), false)
}
return callback(null, true)
}
})
)
const studio = require("./http/studio.js")
app.post("/api/admin/studio", studio.add)
exports.app = functions.https.onRequest(app)
推荐阅读
- javascript - 防止在 javascript 中获取结果
- azure-devops - 在部署到 Azure 应用服务之前,我是否必须压缩工件?
- julia - `ifelse` 和 Julia 中的三元运算符有什么区别?
- azure - Azure 通知中心请求被中止:无法创建 SSL/TLS 安全通道
- json - 从 JSON 重命名 io-circe 案例类字段,但与扩展特征不匹配
- c++ - 如何交换数组中的最后一个元素和最大元素?
- node.js - 用于合并 SQL Server 中的表的数据字段上的 knex 连接返回数组
- c# - 如何使用 NLog 和结构化日志有条件地呈现属性?
- linux - IBM-MQ(9 ver)-> runmqsc -u someuser not take password , 认证失败
- git - 如何搜索(git grep)特定提交和文件类型的更改?