Cloud Functions for Firebase:在文件上传时写入数据库

Cloud Functions for Firebase: write to database on fileupload

我有一个云函数(generateThumbnail 示例函数的修改版本)。我想创建缩略图,但我还想获取图像的宽度和高度,并更新数据库中的尺寸值。

分解这个问题:

  1. 我需要获取当前数据库的快照
  2. 导航到数据库/projects
  3. 使用文件名找到正确的密钥(project.src == 文件名)
  4. 获取图像的大小(完成)
  5. project.size 更新为新值

我做了一些研究,但我只找到了 functions.database.DeltaSnapshot 接口,当你在 functions.database().ref().onwrite(snapshot => {})

上收听时,它是给定的

projects.json:

[{
    "name": "lolipop",
    "src": "lolipop.jpg",
    "size": ""
},{
    "name": "cookie",
    "src": "cookie.jpg",
    "size": ""
}]

可以使用 firebase-admin package. Check out this sample 来完成数据库交互,以查看未由数据库写入触发的函数如何访问数据库。

在 Firebase 中通过其中一个键的值访问子节点有点笨拙,最后会详细介绍。

对于每个问题:

1 和 2:在您的数据库中创建对项目密钥的引用

3: 通过 src 键找到您要查找的项目

5: Update 项目

// create reference
const projectsRef = admin.database().ref('projects');

// create query
const srcProjectQuery = projectsRef.orderByChild('src').equalTo(fileName);

// read objects that fit the query
return srcPojectQuery.once('value').then(snapshot => {
    const updates = {};

    snapshot.forEach(childSnapshot => {
        updates[`${childSnapshot.key}/size`] = fileSize;
    });

    return projectsRef.update(updates);
});

由于您似乎将 src 值视为唯一值,因此使用 src 作为每个项目对象的键可以避免很多麻烦。这会将事情简化为:

const projectsRef = admin.database().ref(`projects/${src}`);
projectsRef.update({'size': fileSize});