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

Akx*_*kxe 2 firebase firebase-realtime-database google-cloud-functions firebase-storage

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

要解决这个问题:

  1. 我需要获取当前数据库的快照
  2. 导航到/projects数据库
  3. 使用filename找到正确的密钥(project.src == fileName)
  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": ""
}]
Run Code Online (Sandbox Code Playgroud)

Jef*_*eff 5

可以使用firebase-admin包完成数据库交互.查看此示例以查看数据库写入未触发的函数如何访问数据库.

通过Firebase中其中一个键的值访问子节点有点笨拙,最后更多.

对于每个问题:

1&2:创建对数据库中项目键的引用

3:通过src密钥找到您正在寻找的项目

5:更新项目

// 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);
});
Run Code Online (Sandbox Code Playgroud)

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

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