Функция Google Cloud - ошибка: ENOENT: нет такого файла или каталога - PullRequest
0 голосов
/ 14 ноября 2018

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

import { tmpdir } from 'os';
import { join, dirname } from 'path';
import * as sharp from 'sharp';
import * as fs from 'fs-extra';

Когда этот код выполняется:

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

Я получаю следующее сообщение об ошибке в журналах Google Cloud Function:

Ошибка: ENOENT: нет такого файла или каталога, откройте «/tmp/images/1542144115815_Emperor_penguins.jpg» при ошибке (собственная)

Вот полный код [сегмента]:

const gcs = admin.storage();
const db = admin.firestore();

import { tmpdir } from 'os';
import { join, dirname } from 'path';

import * as sharp from 'sharp';
import * as fs from 'fs-extra';

export const imageResize = functions.storage
    .object()
    .onFinalize(async object => {
        console.log('> > > > > > > 1.3 < < < < < < <');
        const bucket = gcs.bucket(object.bucket);
        console.log(object.name);
        const filePath = object.name;
        const fileName = filePath.split('/').pop();
        const tmpFilePath = join(tmpdir(), object.name);

        const thumbFileName = 'thumb_' + fileName;
        const tmpThumbPath = join(tmpdir(), thumbFileName);

        console.log('step 1');
        // Resizing image
        if (fileName.includes('thumb_')) {
            console.log('exiting function');
            return false;
        }
        console.log('step 2');
        console.log(`filePath: ${filePath}`);
        console.log(`tmpFilePath: ${tmpFilePath}`);
        await bucket.file(filePath).download({
            destination: tmpFilePath
        });
        console.log('step 3');
        await sharp(tmpFilePath)
            .resize(200, 200)
            .toFile(tmpThumbPath);

        await bucket.upload(tmpThumbPath, {
            destination: join(dirname(filePath), thumbFileName)
        });

ОБНОВЛЕНИЕ 1 : добавлено await fs.ensureDir(tmpFilePath); для обеспечения существования пути к файлу. Теперь получаю новую ошибку:

Ошибка: EINVAL: недопустимый аргумент, откройте «/tmp/images/1542146603970_mouse.png» при ошибке (собственный)

ОБНОВЛЕНИЕ ОБНОВЛЕНО 2 : добавлено решение как Ответ ниже.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Я изменил следующий код

С

const bucket = gcs.bucket(object.bucket);
const filePath = object.name;
const fileName = filePath.split('/').pop();
const tmpFilePath = join(tmpdir(), object.name);

const thumbFileName = 'thumb_' + fileName;
const tmpThumbPath = join(tmpdir(), thumbFileName);

К

const bucket = gcs.bucket(object.bucket);
const filePath = object.name;
const fileName = filePath.split('/').pop();
const thumbFileName = 'thumb_' + fileName;

const workingDir = join(tmpdir(), `${object.name.split('/')[0]}/`);//new
const tmpFilePath = join(workingDir, fileName);
const tmpThumbPath = join(workingDir, thumbFileName);

await fs.ensureDir(workingDir);

Как вы можете видеть, я создал workingDir, который будет разделен между путями, а затем запустил await fs.ensureDir(workingDir); для создания пути. Это решило мою проблему.

0 голосов
/ 14 ноября 2018

Я подозреваю, что вы увидите это сообщение, потому что пытались написать по этому пути:

/tmp/images/1542144115815_Emperor_penguins.jpg

Без предварительного создания родительского каталога:

/tmp/images

Вы не можете написатьфайл в локальной папке файловой системы, который не существует, и кажется, что Cloud Storage SDK не создаст его для вас.

...