当我尝试部署我的函数时,firebase 抱怨这个:
const admin = require('firebase-admin');
const functions = require('firebase-functions');
const C = require('../both/constants.js');
exports.myFunc = functions.database.ref('aRef').onCreate((event) => {
// blah blah
}
Error: Error parsing triggers: Cannot find module '../both/constants.js'
Run Code Online (Sandbox Code Playgroud)
但不是这个:
const admin = require('firebase-admin');
const functions = require('firebase-functions');
// This is the invite that goes to organizations.
exports.myFunc = functions.database.ref('aRef').onCreate((event) => {
const C = require('../both/constants.js');
}
Run Code Online (Sandbox Code Playgroud)
这是为什么?
更新:看起来会发生这种情况是因为该函数直到运行时才会查找依赖项。这当然是一个问题,因为仍然需要依赖项。我应该提到我的项目是这样的:
both
constants.js
functions
index.js
myFunc.js
Run Code Online (Sandbox Code Playgroud)
更新 2既然我正在将堆栈完全转移到 Firebase 函数,我又重新开始处理这个问题。模块需要发布才能在函数内工作。对于发生在此psot上的任何人,仅供参考。
我正在使用 moment.js 将 ISO 日期/时间/区域字符串转换为本地字符串。根据文档和其他类似的问题,例如this,本来应该非常简单的事情结果却并非如此,并且给了我一些奇怪的输出。这是我所拥有的:
\n\nconsole.log(\'date/time before is: \', date);\n// date/time before is: 2016-12-23T23:10:00.000Z\n\nvar datetime = moment(date).format("dddd, MMMM Do YYYY, h:mm:ss a");\n\nconsole.log(\'date/time after is: \', datetime);\n// date/time after is: p\xc3\xa1tek, prosinec 23. 2016, 3:10:00 pm\nRun Code Online (Sandbox Code Playgroud)\n\n我使用的格式字符串直接来自文档。目的是在它工作后能够按照我需要的方式对其进行格式化。
\n我正在对数据建模,并且对onSnapshot(Web)侦听器有疑问。正如在SO和文档中的几篇文章中所指出的,在初始调用之后,侦听器仅获取更改的数据。我有兴趣知道更改后的数据是什么。如果侦听文档,那么获取的仅仅是字段还是整个文档?
在一个文档上有一个侦听器,并且该文档上的字段的值发生更改(或者添加或删除了一个字段)的情况下,仅获取该字段吗?换句话说,这类似于将child_changed/added/removed侦听器放置在RTDB中的节点上吗?
目的是确定我是否应该在RTDB或Firestore中保持经常更改的文档,客户端必须收听哪些文档。我宁愿不要仅由于字段更改而将整个文档重新发送给客户。
例。我们有以下文件:
rando_id:
field1
field2
field3
Run Code Online (Sandbox Code Playgroud)
如果field2的值发生变化,将仅field2是从Firestore DB传输到客户端的数据吗?同样适用于添加field4或删除field1。是否会将这些字段发送给客户端?
我正在建立一个服务器路由,我希望限制其仅由经过身份验证的用户使用。我计划将带有POST的user.uid发送到此路由,并且我想验证UID是Firebase中存在的UID。我知道我可以在Firebase中手动添加UID并对照此数据进行检查,但是可以查看Firebase身份验证正在跟踪哪些UID?我认为这种方法比对照我自己的列表要好。
这样做的目的是确保不会使用伪造的UID访问这些路由(例如,出于恶意目的)。
从客户端调用它时,我的 Firebase http 函数无法正常工作。以下是客户端的错误:
OPTIONS https://us-central1-my-app.cloudfunctions.net/my-func 500 ()
Failed to load https://us-central1-my-app.cloudfunctions.net/my-func:
Response to preflight request doesn't pass access control check:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost:3000' is therefore not allowed access.
The response had HTTP status code 500.
Run Code Online (Sandbox Code Playgroud)
这是我的函数的样子:
const admin = require('firebase-admin');
const functions = require('firebase-functions');
const cors = require('cors')({origin: true});
exports.func = functions.https.onRequest((req, res) => {
return cors((req, res, () => {
res.send("hello");
}));
});
Run Code Online (Sandbox Code Playgroud)
Firebase 函数日志提供以下信息:
TypeError: Cannot read property 'origin' …Run Code Online (Sandbox Code Playgroud) 我对Firebase功能事件缺乏了解.为了使我的功能按预期工作,我在参考路径中添加了更多特异性,然后我认为是必需的.
例如,我希望每次在此路径中添加或删除子项时递增或递减计数:
/invites
我用这些作为我的函数来完成这个:
functions.database.ref('/invites').onCreate(event => {
return admin.database().ref('/counter').transaction((current) => {
return (current || 0) + 1;
})
});
functions.database.ref('/invites').onDelete(event => {
return admin.database().ref('/counter').transaction((current) => {
if (current >=1) return (current - 1);
else return;
})
});
Run Code Online (Sandbox Code Playgroud)
这就是我的基础:
路径规范匹配所有触摸路径的写入,包括发生在其下方任何位置的写入.如果将函数的路径设置为/ foo/bar,则它会匹配以下两个位置的事件:
/富/酒吧
/富/酒吧/巴兹/真的/深/路径
在我的情况下,/invites将相当于/bar该示例.
但是,上述功能仅在添加的第一个孩子/invites以及被删除的最后一个孩子上触发.在这两个条件之外,其他任何东西都不会触发计数器功能.我能够完成这项工作的唯一方法是使用它作为我的路径:
invites/{idOfInvite}
虽然我知道这会起作用,但我不知道这正是我需要的.后来我可能决定在某个路径下添加新数据{idOfInvite},这会导致我的计数器功能被激活(我想?).
这个SO答案表明我的函数的行为是预期的,但根据我对文档的理解,它不是我所期望的.也许我正在错误地解释文档?
正如您所知,我对这些添加/删除事件触发方式的理解有些不同.
javascript firebase firebase-realtime-database google-cloud-functions