如何在 Firestore 中的任何集合中的任何文档更改时触发函数?我想管理createdAt
和updatedAt
时间戳。我有很多集合,不想为每个集合单独注册触发器。在这一点上我还不如直接创建包装函数add
,set
和update
。
如何注册在修改任何文档时触发的回调?
编辑:
这个时候(2019-08-22),我决定只创建一个包装函数来实现这个功能。接受的答案不保持无模式。基于这篇文章,我创建了这个upset
函数来管理时间戳并避免“文档不存在”错误:
const { firestore: { FieldValue } } = require('firebase-admin')
module.exports = async function upset (doc, data = {}) {
const time = FieldValue.serverTimestamp()
const update = { updatedAt: time }
const updated = { ...data, ...update }
try {
const snapshot = await doc.get()
if (snapshot.exists) {
return doc.update(updated)
} else {
const create = { createdAt: time }
const …
Run Code Online (Sandbox Code Playgroud) triggers firebase google-cloud-functions google-cloud-firestore
我想使用 Firestore 和云功能将用户的状态字段更新为值 (true) 时向用户发送电子邮件。
我的情况:我有一个用户(集合),它有更多的 userId(文档)文档,每个文档都包含字段和值。字段之一是 status: true | 假(布尔)。
如果该用户的状态使用云功能和 sendgrid api 更改为 true,我想向该用户发送电子邮件。
users
- dOpjjsjssdsk2121j131
- id : dOpjjsjssdsk2121j131
- status : false
- pspjjsjssdsdsk2121j131
- id : pspjjsjssdsdsk2121j131
- status : false
- yspjjsjssdsdsk2121j131
- id : yspjjsjssdsdsk2121j131
- status : false
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const SENDGRID_API_KEY = functions.config().sendgrid.key;
const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(SENDGRID_API_KEY);
exports.sendEmail = functions.firestore.document('users/{userId}')
.onUpdate((change, context) => {
const after = change.after.val();
if(after.status === 'VERIFIED'){
console.log('profile …
Run Code Online (Sandbox Code Playgroud) 我创建了一个私有类型 npm 模块,用于我的 firebase 函数和应用程序项目。当我去部署 firebase 函数时,对于每个基本上说的函数,我都会遇到一个大错误ERR! remote: Invalid username or password.
对于我所阅读的内容,看起来我需要创建一个 .npmrc 文件并将其放在 /functions 目录中。(https://cloud.google.com/functions/docs/writing/specifying-dependencies-nodejs#using_private_modules)
但是,我无法在任何地方找到有关如何执行此操作的正确说明。根据我的发现,我做了以下工作:
这就给了我一个令牌,看起来像这样:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
。
然后我在我的函数目录中创建一个名为 .npmrc 的文件,并将其放入//registry.npmjs.org/:_authToken=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
其中。
此外,我看到错误消息试图使用 ssh 来安装我的私有 repo 包,我没有设置 ssh 而是使用 https,因此我将我的包文件更改为git+https://github.com/accounts-name/repo#commit-num
使用 HTTPS。
但是,我仍然收到相同的错误消息。我错过了什么?以上是我从大量谷歌搜索中串起来的。
我面临的问题是 Cloud Storage 按字典顺序(字母顺序)对新添加的文件进行排序,而我正在使用 Cloud Functions 中的 Python 客户端库读取 Cloud Storage 存储桶中索引 0 处的文件(必须使用云函数作为我项目的一部分)并将数据放在 BigQuery 中,这对我来说很好用,但新添加的文件并不总是出现在索引 0 处。
流文件每天在不同时间进入我的存储桶。文件名相同(data-2019-10-18T14_20_00.000Z-2019-10-18T14_25_00.txt)但文件名中的日期和时间字段在每个新添加的文件中都不同。
每次触发云功能时,如何调整此python代码以读取Cloud Storage存储桶中最新添加的文件?
files = bucket.list_blobs()
fileList = [file.name for file in files if '.' in file.name]
blob = bucket.blob(fileList[0]) #reading file placed at index 0 in bucket
Run Code Online (Sandbox Code Playgroud) python client-library google-cloud-storage google-cloud-platform google-cloud-functions
使用 Firebase Storage 存储图像时,图像的 URL 如下所示: https ]?alt=media&token=[令牌]
我想得到这个网址。
根据this、this、this和this,我需要使用该.getDownloadURL()
方法,该方法位于“存储引用”..但可用对象的文档与实际对象不符。
当我尝试访问.getDownloadURL()
下面代码中文档建议的对象上的方法时,我收到了各种未找到属性的错误。
const admin = require('firebase-admin');
admin.initializeApp();
admin
.storage()
.bucket()
.upload(imageToBeUploaded.filepath, {
destination: storageFolder,
resumable: false,
metadata: {
metadata: {
contentType: imageToBeUploaded.mimetype
}
}
})
.then((taskSnapshot) => {
// HOW DO I GET THE DOWNLOADABLE URL
})
Run Code Online (Sandbox Code Playgroud)
我试过以下:
taskSnapshot[1].getDownloadURL()
,
admin.storage().ref(storageFolder+'/'+imageFileName).getDownloadURL()
,
admin.storageRef(storageFolder+'/'+imageFileName).getDownloadURL()
,
admin.storage().ref().child(storageFolder+'/'+imageFileName).getDownloadURL()
,
.. 和一堆其他人。
反复试验没有找到具有该方法的“storageRef”,
firebase google-cloud-functions firebase-storage firebase-admin
我似乎在从 firebase 云函数中的 fetch 调用获取预期响应时遇到问题。我确定这是由于我对响应、承诺等的工作方式缺乏了解。
我正在尝试将 atlassian 人群的休息 api 用于 SSO。如果我使用邮递员,我可以从请求中获得所需的结果。所以我知道它的一部分正在起作用。
导致我使用云功能的原因是使用 fetch 发出相同的请求会导致来自本地主机的 CORS 问题。我想如果我可以将浏览器排除在外,那么 CORS 问题就会消失。他们有,但我没有得到想要的回应。
我的云函数如下所示:
const functions = require('firebase-functions');
const fetch = require('node-fetch');
const btoa = require('btoa');
const cors = require('cors')({origin:true});
const app_name = "app_name";
const app_pass = "app_password";
exports.crowdAuthentication = functions.https.onRequest((request, response)=>
{
cors(request, response, () =>{
let _uri = "https://my.server.uri/crowd/rest/usermanagement/1/session";
let _headers = {
'Content-Type':'application/json',
'Authorization':`Basic ${btoa(`${app_name}:${app_pass}`)}`
}
let _body = {
username: request.body.username,
password: request.body.password
}
const result = fetch(_uri, {
method: 'POST', …
Run Code Online (Sandbox Code Playgroud) javascript cors atlassian-crowd firebase google-cloud-functions
我有一个现有系统,其中数据发布到 Pub/Sub 主题,由云功能订阅者读取并推送到 Big Query 以存储它(订阅者 CF 中未完成其他转换)。
使用 pub/sub-BQ 模板将我的订阅者 CF 更改为 Dataflow 流作业是个好主意吗?使用它们的优点/缺点是什么?
google-cloud-platform google-cloud-pubsub google-cloud-dataflow google-cloud-functions
我正在按照教程在上传时通过 Cloud Functions 调整图像大小,但遇到了两个我无法弄清楚的主要问题:
1) 如果上传了 PNG,它会生成大小正确的缩略图,但它们的预览不会在 Firestorage 中加载(加载微调器无限期显示)。它只在我点击“生成新的访问令牌”后显示图像(最初生成的缩略图都没有访问令牌)。
2) 如果上传了 JPEG 或任何其他格式,则 MIME 类型显示为“application/octet-stream”。我不确定如何正确提取扩展名以放入新生成的缩略图的文件名中?
export const generateThumbs = functions.storage
.object()
.onFinalize(async object => {
const bucket = gcs.bucket(object.bucket);
const filePath = object.name;
const fileName = filePath.split('/').pop();
const bucketDir = dirname(filePath);
const workingDir = join(tmpdir(), 'thumbs');
const tmpFilePath = join(workingDir, 'source.png');
if (fileName.includes('thumb@') || !object.contentType.includes('image')) {
console.log('exiting function');
return false;
}
// 1. Ensure thumbnail dir exists
await fs.ensureDir(workingDir);
// 2. Download Source File
await bucket.file(filePath).download({
destination: tmpFilePath …
Run Code Online (Sandbox Code Playgroud) 在这里尝试使用云功能进行一些小技巧,但似乎无法弄清楚问题是什么。
我目前正在使用 now.sh 来托管无服务器函数,并希望从另一个函数调用 1 个函数。假设我声明了 2 个函数fetchData
& setData
。setData
调用该fetchData
函数时,它会处理一些数据,然后调用该函数。
export const setData = async (req: Request, res: Response) => {
await axios.post(
fetchDataEndpointUrl,
{
params: {
key,
},
},
);
return res.json({
payload: true,
});
}
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常,但完成整个操作所需的时间将是 setData 函数调用 + 完成 fetchData 函数调用所需的时间。我想要做的是调用 ,fetchData
而不必等待它完成基本上删除await
axios 调用中的 。我试过删除,await
但当通话结束时setData
通话突然结束。有没有办法解耦这个动作而不必等待setData
函数完成?
我正在为一个项目使用Firebase 云函数,其中一些函数从 firebase 数据库中获取数据。
我想通过利用 LRU 缓存来加快其中一些查询的速度,但目前尚不清楚 Firebase 云功能是否可以实现这一点。
有谁知道 Firebase 云功能是否可以访问任何类型的缓存/半持久内存访问?其他人可以在这个问题上提供的任何帮助都会非常有帮助!
firebase ×5
node.js ×3
javascript ×2
android ×1
cors ×1
npm ×1
python ×1
triggers ×1
typescript ×1
vercel ×1