使用Firebase功能更新存储更改中的Firebase数据库

时间:2017-05-20 13:15:11

标签: node.js firebase firebase-realtime-database firebase-storage google-cloud-functions

我正在尝试在我的Android应用中实现个人资料图片功能。所以我使用了来自firebase的Generate Thumbnail样本。因此,每当我上传完整尺寸的图像时,它都会为我生成缩略图。但是我希望在生成缩略图后更新实时数据库中缩略图的URL。

const functions = require('firebase-functions');
const mkdirp = require('mkdirp-promise');
const gcs = require('@google-cloud/storage')();
const spawn = require('child-process-promise').spawn;
const LOCAL_TMP_FOLDER = '/tmp/';

// Max height and width of the thumbnail in pixels.
const THUMB_MAX_HEIGHT = 100;
const THUMB_MAX_WIDTH = 100;
// Thumbnail prefix added to file names.
const THUMB_PREFIX = 'thumb_';

/**
 * When an image is uploaded in the Storage bucket We generate a thumbnail automatically using
 * ImageMagick.
 */
exports.generateThumbnail = functions.storage.object().onChange(event => {
  const filePath = event.data.name;
  const filePathSplit = filePath.split('/');
  const fileName = filePathSplit.pop();
  const fileDir = filePathSplit.join('/') + (filePathSplit.length > 0 ? '/' : '');
  const thumbFilePath = `${fileDir}${THUMB_PREFIX}${fileName}`;
  const tempLocalDir = `${LOCAL_TMP_FOLDER}${fileDir}`;
  const tempLocalFile = `${tempLocalDir}${fileName}`;
  const tempLocalThumbFile = `${LOCAL_TMP_FOLDER}${thumbFilePath}`;

  // Exit if this is triggered on a file that is not an image.
  if (!event.data.contentType.startsWith('image/')) {
    console.log('This is not an image.');
    return;
  }

  // Exit if the image is already a thumbnail.
  if (fileName.startsWith(THUMB_PREFIX)) {
    console.log('Already a Thumbnail.');
    return;
  }

  // Exit if this is a move or deletion event.
  if (event.data.resourceState === 'not_exists') {
    console.log('This is a deletion event.');
    return;
  }

  // Create the temp directory where the storage file will be downloaded.
  return mkdirp(tempLocalDir).then(() => {
    // Download file from bucket.
    const bucket = gcs.bucket(event.data.bucket);
    return bucket.file(filePath).download({
      destination: tempLocalFile
    }).then(() => {
      console.log('The file has been downloaded to', tempLocalFile);
      // Generate a thumbnail using ImageMagick.
      return spawn('convert', [tempLocalFile, '-thumbnail', `${THUMB_MAX_WIDTH}x${THUMB_MAX_HEIGHT}>`, tempLocalThumbFile]).then(() => {
        console.log('Thumbnail created at', tempLocalThumbFile);
        // Uploading the Thumbnail.
        return bucket.upload(tempLocalThumbFile, {
          destination: thumbFilePath
        }).then(() => {
          console.log('Thumbnail uploaded to Storage at', thumbFilePath);
          // Don't know what to write here.
        });
      });
    });
  });
});

一旦此代码的最终承诺完成,我想从/users/{userId}/profilePic

生成的个人资料图片中获取可下载的网址

1 个答案:

答案 0 :(得分:2)

你需要添加一些东西来实现你想要的东西。首先,您需要使用firebase-admin并初始化应用程序。

<div id="tag"></div>

在您需要其他组件后,应在文件顶部完成此操作。

一旦你有了这个,你可以在最终的承诺中添加一些代码,用新的参考来更新数据库。

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

您可以在此处阅读有关更新参考的事务。我只包含了强制的transactionUpdate  参数而不是您可能需要的可选参数。 https://firebase.google.com/docs/reference/admin/node/admin.database.Reference#transaction