我在从Firebase Hosting提供一些动态内容时遇到了一些问题。
我编写了一个http.onRequest()
云函数,它返回一个图像(内容类型:image/jpeg(作为响应。如果我直接在它的url:上访问它,该函数就会正常工作
https://us-central1-my-project-id.cloudfunctions.net/hosting-getPartnerImg
根据文档,我使用的是us-central1
区域。
我希望能够使用Firebase Hosting调用这个函数,我已经配置如下:
firebase.json(片段(
"rewrites" : [
{
"source" : "/pimg",
"function" : "hosting-getPartnerImage"
}
],
"headers": [
{
"source": "/pimg",
"headers": [ {
"key": "Cache-Control",
"value": "max-age=60"
},
{
"key": "Access-Control-Allow-Origin",
"value": "*"
}
]
}]
index.js(摘录(
const functions = require('firebase-functions');
const admin = require('firebase-admin');
let firebaseDefaultConfig = JSON.parse(process.env.FIREBASE_CONFIG);
admin.initializeApp(firebaseDefaultConfig);
const fn = process.env.FUNCTION_NAME;
if(!fn || fn === 'hosting-getPartnerImg'){
exports.hosting = require('./hosting.js');
}
hosting.js
const functions = require('firebase-functions');
const admin = require('firebase-admin');
exports.getPartnerImg = functions.region("us-central1").https.onRequest((req, res) => {
const partnerId = req.query.partner;
const fileName = req.query.file;
res.set("content-type", "image/jpeg");
const bucket = admin.storage().bucket();
let file = bucket.file("partnerImgs/" + partnerId + "/" + fileName);
let readStream = file.createReadStream();
readStream.pipe(res);
});
这件事把我难住了。导航到类似的URL
https://my-project-id.web.app/pimg?partner=BLAH&file=foo.jpg
不会像其他URL那样生成PageNotFound,所以我有理由相信重写会如期进行。如果是这样的话,为什么我会立即被带到:
带有消息的appengine.google.com/_ah/loginform...
:
**一个应用程序正在请求对您的Google帐户的权限**
HTTPonRequest
云功能不能通过Firebase Hosting匿名使用吗?为什么当我直接点击它时,该功能可以工作,而当我通过Firebase Hosting重写访问它时,它却请求权限。
任何想法都将不胜感激。
AppEngine登录页面行为是指当被调用的函数不存在时发生的行为(无论是否通过重写(。
你的问题是这个重写:
"function" : "hosting-getPartnerImage"
与实际功能名称相比:
if(!fn || fn === 'hosting-getPartnerImg'){
或
exports.getPartnerImg = ...
值得注意的是,重写没有调用正确的函数。
您应该将重写更改为调用hosting-getPartnerImg
。