Firebase的云功能:在fileupload上写入数据库

时间:2017-05-25 14:31:06

标签: firebase firebase-realtime-database firebase-storage google-cloud-functions

我有一个云功能(generateThumbnail示例功能的修改版本)。我想创建缩略图,但我也希望获得图像宽度和高度,并更新数据库中的大小值。

解决这个问题:

  1. 我需要获取当前数据库的快照
  2. 导航至数据库的/projects
  3. 使用filename(project.src == fileName)
  4. 查找正确的密钥
  5. 获取图像大小(已完成)
  6. project.size更新为新值
  7. 我做了一些研究,但是当你聆听functions.database.DeltaSnapshot

    时,我只找到了functions.database().ref().onwrite(snapshot => {})界面。

    projects.json:

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

1 个答案:

答案 0 :(得分:5)

可以使用firebase-admin包完成数据库交互。查看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});