Ошибка: ENOENT: нет такого файла или каталога, даже если файл существует в Firebase Cloud Functions - PullRequest
0 голосов
/ 02 апреля 2020

Я относительно новичок в облачных функциях и уже некоторое время пытаюсь решить эту проблему. По сути, функция, которую я пытаюсь написать, вызывается всякий раз, когда происходит полная загрузка в Firebase Cloud Storage. Тем не менее, когда функция выполняется в половине случаев, она запускается со следующей ошибкой:

The following error occured:  { Error: ENOENT: no such file or directory, open '/tmp/dataprocessing/thisisthefilethatiswritten.zip'
  errno: -2,
  code: 'ENOENT',
  syscall: 'open',
  path: '/tmp/dataprocessing/thisisthefilethatiswritten.zip' }

Вот код:

const functions = require('firebase-functions');
const admin = require('firebase-admin')
const inspect = require('util').inspect
const path = require('path');
const os = require('os');
const fs = require('fs-extra');

const firestore = admin.firestore()
const storage = admin.storage()

const runtimeOpts = {
    timeoutSeconds: 540,
    memory: '2GB'
  }

const uploadprocessing = functions.runWith(runtimeOpts).storage.object().onFinalize(async (object) => {
    const filePath = object.name
    const fileBucket = object.bucket
    const bucket_fileName = path.basename(filePath);
    const uid = bucket_fileName.match('.+?(?=_)')
    const original_filename = bucket_fileName.split('_').pop()

    const bucket = storage.bucket(fileBucket);
    const workingDir = path.join(os.tmpdir(), 'dataprocessing/');
    const tempFilePath = path.join(workingDir, original_filename);

    await fs.ensureDir(workingDir)

    await bucket.file(filePath).download({destination: tempFilePath})

    //this particular code block I included because I was worried that the file wasn't
    //being uploaded to the tmp directly, but the results of the function 
    //seems to confirm to me that the file does exist.

    await fs.ensureFile(tempFilePath)
        console.log('success!')
        fs.readdirSync(workingDir).forEach(file => {
            console.log('file found: ', file);
            });
        console.log('post success')
        fs.readdirSync('/tmp/dataprocessing').forEach(file => {
            console.log('tmp file found: ', file);
    })


    fs.readFile(tempFilePath, function (err, buffer) {
        if (!err) {
            //data processing comes here. Please note that half the time it never gets into this
            //loop as instead it goes into the else function below and outputs that error.
        }
        else {
            console.log("The following error occured: ", err);
        }
    })
    fs.unlinkSync(tempFilePath);
    return
})
module.exports = uploadprocessing;

Я пробовал так много разных вещей и странная вещь заключается в том, что когда я добавляю код в «if (! err)» (который на самом деле не запускается из-за ошибки), он просто произвольно начинает работать иногда довольно последовательно, но затем он перестает работать, когда я добавляю другой код. Я бы предположил, что проблема возникает из кода, который я добавил, но тогда ошибка возникает буквально, когда я просто меняю / добавляю / удаляю также комментарии ... Что технически не должно влиять на работу функции ...

Есть мысли? Заранее спасибо!!! :)

1 Ответ

1 голос
/ 02 апреля 2020

fs.readFile является асинхронным и возвращается немедленно. Ваша функция обратного вызова вызывается через некоторое время с содержимым буфера. Это означает, что fs.unlinkSync будет удалять файл одновременно с чтением. Это означает, что у вас фактически есть состояние гонки, и возможно, что файл будет удален до того, как он будет прочитан.

Ваш код должен дождаться завершения чтения, прежде чем перейти к удалению. Возможно, вы хотите использовать fs.readFileSyn c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...