Firebase 的 Cloud Functions - 无法加载 URL:不存在“Access-Control-Allow-Origin”标头
Posted
技术标签:
【中文标题】Firebase 的 Cloud Functions - 无法加载 URL:不存在“Access-Control-Allow-Origin”标头【英文标题】:Cloud Functions for Firebase - Cannot load URL: No 'Access-Control-Allow-Origin' header is present 【发布时间】:2017-08-31 20:49:06 【问题描述】:我有一个 Angular 2 应用程序,我通过 http 请求调用 Firebase。但是,任何时候,我尝试运行该函数,都会收到此错误:
XMLHttpRequest cannot load https://us-central1-<my-projectId>.cloudfunctions.net/getUserByEmail?email=user@email.com. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access. The response had HTTP status code 500.
error_handler.js:54 EXCEPTION: Response with status: 0 for URL: null
ErrorHandler.handleError @ error_handler.js:54
next @ application_ref.js:348
schedulerFn @ async.js:93
SafeSubscriber.__tryOrUnsub @ Subscriber.js:234
SafeSubscriber.next @ Subscriber.js:183
Subscriber._next @ Subscriber.js:125
Subscriber.next @ Subscriber.js:89
Subject.next @ Subject.js:55
EventEmitter.emit @ async.js:79
NgZone.triggerError @ ng_zone.js:333
onHandleError @ ng_zone.js:294
ZoneDelegate.handleError @ zone.js:338
Zone.runTask @ zone.js:169
ZoneTask.invoke @ zone.js:420
Subscriber.js:238 Uncaught Response _body: ProgressEvent, status: 0, ok: false, statusText: "", headers: Headers…
这是我的 Cloud Function for Firebase index.js
文件:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const cors = require('cors')(origin: true);
/**
* Function to get a user by email
*/
exports.getUserByEmail = functions.https.onRequest((req, res) =>
cors(request, response, () =>
// This should return a promise from the getUserByEmail function
response.status(200).send(admin.auth().getUserByEmail(req.query.email))
)
);
下面是我在组件中调用函数的方式(假设 HTTP 请求成功):
this.http.get('https://us-central1-rosebud-9b0ed.cloudfunctions.net/getUserByEmail',
search: "user@email.com"
).subscribe(data =>
console.log('data', data);
)
似乎无论我尝试什么,我都会遇到同样的问题。我什至尝试将它部署到我的 firebase 托管 URL,但它仍然给我这个错误。有人知道我可以在这里做什么吗?
提前致谢!
【问题讨论】:
这是this question 的副本,尽管您可能不知道 :) 【参考方案1】:所以我在这里犯了几个关键错误。
-
确保在初始化 Firebase 应用之前需要
cors
。
确保参数与cors()
函数一致。
这是更新后的index.js
代码:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const cors = require('cors')(origin: true);
admin.initializeApp(functions.config().firebase);
/**
* Function to get a user by email
*/
exports.getUserByEmail = functions.https.onRequest((request, response) =>
cors(request, response, () =>
// This should return a promise from the getUserByEmail function
response.status(200).send(admin.auth().getUserByEmail(req.query.email))
)
);
【讨论】:
如果我将函数分组到单独的文件中,您在初始化 Firebase 应用程序之前如何要求 cors? (firebase.google.com/docs/functions/…)以上是关于Firebase 的 Cloud Functions - 无法加载 URL:不存在“Access-Control-Allow-Origin”标头的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Cloud Function 调用其他 Cloud Firebase Functions
在 Cloud Function for Firebase 中设置 Firebase 消息的优先级
是否可以检索 Firebase Cloud Function 源代码?
Firebase Cloud Function 部署 tslint 错误