Как удалить файл с помощью облачной функции JavaScript firebase? - PullRequest
0 голосов
/ 29 апреля 2020

Я хотел удалить файл из хранилища при удалении узла данных из базы данных реального времени. имя удаляемого файла берется перед удалением. Имя файла сохраняется в дочернем узле с именем «imageTitle». Код работает нормально до реализации кода удаления файла. Я имею в виду, что узлы удаляются идеально.

Когда я реализую код удаления файла, все остальное не работает, но ошибок нет. Код после удаления файла не работает. Я не знаю, почему.

Это для окончательного проекта Academi c.

В папке есть папка с именем images, и файл, который мне нужно удалить, находится там. Имя файла взято у дочернего узла, который должен быть удален в базе данных реального времени с именем imageTitle:

    'use strict';

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


    exports.changetime = functions.database.ref('/posts/{pushId}')
    .onCreate((snapshot, context) => {
    const editDate = Date.now()
    datas = snapshot.val();
    return snapshot.ref.update({editDate})
})

    const CUT_OFF_TIME = 1 * 60 * 1000; 

/**
 * This database triggered function will check for child nodes that are older than the
 * cut-off time. Each child needs to have a `timestamp` attribute.
 */


    exports.deleteOldItems = functions.database.ref('/posts/{pushId}').onWrite(async (change, 
    context) => {
    const ref = change.after.ref.parent; // reference to the parent
    const now = Date.now();
    const id = context.params.pushId;
    const cutoff = now - CUT_OFF_TIME;
    const oldItemsQuery = ref.orderByChild('createdDate').endAt(cutoff);
    const snapshot = await oldItemsQuery.once('value');

    const getImageTitle = admin.database().ref(`/posts/${id}/imageTitle`).once('value');

    return getImageTitle.then(imageTitle => {

    console.log('post author id', imageTitle.val());
    const imageName =  imageTitle.val();
    const filePath = 'images/' + imageName;


    const path = `images/${imageName}`;
    const bucket = app.storage().bucket();
    return bucket.file(path).delete().then(() =>{
    console.log(`File deleted successfully in path: ${imageName}`)

/* The problem is here. the code doesn't work after file.delete function. no errors. but doesn't work
if I remove that piece of code the other codes work fine. I mean the realtime database nodes get deleted and updated perfectly */

    const updates = {};
    snapshot.forEach(child => {
    updates[child.key] = null;
    if(updates[child.key] == null){
    admin.database().ref(/post-likes/+id).remove();
   }
   })

   return ref.update(updates);
   });
   });
   [my storage looks like this][1]});

В корзине есть папка с именем images, и файл, который мне нужно удалить, находится в там. Имя файла берется из дочернего узла, идентификатор которого будет удален в базе данных реального времени imageTitle:

введите описание изображения здесь

1 Ответ

0 голосов
/ 30 апреля 2020

Я думаю, что это проблема:

const filePath = 'images/' + imageName;


const path = `images/${imageName}`;

Вы должны использовать filePath, а не path в качестве ссылки на ведро. const path = `images/${imageName}`; - это синтаксис подстановочного знака, используемый при запросах, а не при назначении переменных .... думаю, что вы остались в режиме 'Dart' здесь :-). Поэтому я не уверен, что содержит path, но console.log, чтобы увидеть.

Вот некоторый код, который я использую для удаления изображений из моего хранилища, который отлично работает. Сначала проверьте несколько вещей (лучше всего сделать с помощью console.log, никогда не предполагайте, что вы знаете, что находится в переменной), и выполните:

  1. Убедитесь, что imageName, filePath, path и bucket содержат то, что они должны содержать.
  2. Включите блок .catch в свой код, чтобы проверить, есть ли на самом деле ошибка
  3. Мне не ясно, выполняется ли console.log(`File deleted successfully in path: ${imageName}`) но если это не так, ваш file.delete должен выдать ошибку, которую должен перехватить блок catch.

Фрагмент кода:

const oldProfileImagePath = "profileImages/" + authenticatedUserId + "/" + oldProfileImageName;
      return bucket.file(oldProfileImagePath).delete()
        .then(function () {
          console.info("Old Profile Image: " + oldProfileImagePath + " deleted!");
        })
        .catch(function (error) {
          console.error("Remove Old Profile Image: " + oldProfileImagePath +
            " failed with " + error.message)
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...