Тайм-аут при попытке загрузить файл из хранилища на FTP-сервер, проходящий через облачную функцию - PullRequest
0 голосов
/ 29 мая 2018

Я на самом деле сталкиваюсь с проблемой, когда пытаюсь загрузить файл из хранилища на FTP-сервер, передавая функцию js триггерного узла.

Итак, каждый раз, когда файл с определенным именем,загружается в хранилище Firebase, этот файл должен автоматически загружаться на FTP-сервер.Для этого я использую обещание-ftp .Я могу подключиться к серверу, но когда дело доходит до загрузки файлов, я сталкиваюсь с таймаутом соединения.Я пытался с другим узлом пакета.Те же проблемы

Но когда я выполняю скрипт js локально, не передавая триггером, файл успешно загружается.

Мой сценарий обещания-ftp, который я пробовал локально, выглядит так:

function test() {
  var ftp = new PromiseFtp();
  const tempFilePath = path.join(os.tmpdir(), '123.pdf');
  ftp.connect({host: 'ftp.aaa-bbbb.ccc', user: 'aaabbb', password: 'pswd123'})
  .then(function (serverMessage) {
    console.log(serverMessage);
    return ftp.put(tempFilePath, 'local.pdf');
  })
  .then(function () {
    return ftp.end();
  })
  .then(() => {
    console.log("Ready to delete");
     // Once the pdf has been uploaded delete the local file to free up disk space.
    fs.unlinkSync(tempFilePath);
  });
}

Узел js может функционировать с использованием одного и того же кода, но имя файла и имя назначения различаются.

Есть идеи?

ОБНОВЛЕНИЕ # 1

exports.updateToFTP = functions.storage.object().onFinalize((object) => {
    // [START eventAttributes]
    const fileBucket = object.bucket; // The Storage bucket that contains the file.
    const filePath = object.name; // File path in the bucket.
    const contentType = object.contentType; // File content type.
    const resourceState = object.resourceState; // The resourceState is 'exists' or 'not_exists' (for file/folder deletions).
    const metageneration = object.metageneration; // Number of times metadata has been generated. New objects have a value of 1.
    // [END eventAttributes]

  // [START stopConditions]
  // Exit if this is triggered on a file that is not an image.
  if (resourceState === 'exists') {
    // ignore for deletions
    return
  }
  if (!contentType.startsWith('application/pdf')) {
    return null;
  }
  // [END stopConditions]
  // Get the file name.
  const fileName = path.basename(filePath);
  // get file from bucket.
  const bucket = gcs.bucket(fileBucket);
  const tempFilePath = path.join(os.tmpdir(), fileName);
  var ftp = new PromiseFtp();
  return bucket.file(filePath).download({
    destination: tempFilePath,
  }).then(() => {
    return ftp.connect({host: 'host', user: 'usr', password: 'pwd'})
  }).then(function (serverMessage) {
    console.log(serverMessage);
    return ftp.put(tempFilePath, fileName);
  }).then(function () {
    return ftp.end();
  })
  .then(() => {
    console.log("Ready to delete");
     // Once the pdf has been uploaded delete the local file to free up disk space.
    fs.unlinkSync(tempFilePath);
  }).catch((err) => {
      console.log("Catching error");
      console.log(err)
  });
})

Ошибка: (только с пакетом ftp)

Timed out while making data connection
    at Timeout._onTimeout (/user_code/node_modules/ftp/lib/connection.js:901:12)
    at ontimeout (timers.js:386:11)
    at tryOnTimeout (timers.js:250:5)
    at Timer.listOnTimeout (timers.js:214:5)

Случайная ошибка с обещанием ftp (не может воспроизвести его локально):

ReferenceError: reentry is not defined
    at /user_code/node_modules/promise-ftp/node_modules/@icetee/ftp/lib/connection.js:937:18
    at Timeout._onTimeout (/user_code/node_modules/promise-ftp/node_modules/@icetee/ftp/lib/connection.js:962:9)
    at ontimeout (timers.js:386:11)
    at tryOnTimeout (timers.js:250:5)
    at Timer.listOnTimeout (timers.js:214:5)

Возможно, это плохая практика для загрузки файла из хранилища на FTP ...

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Функции Firebase имеют ограничение по времени, поэтому, если размер вашего файла большой или у вас есть сетевая задержка, которая в результате увеличивает время передачи файла, функция отключится.

Вот ссылка на ограниченияfirebase указал: https://cloud.google.com/functions/quotas#time_limits

Вы можете использовать триггер, чтобы вызвать веб-крючок с загружаемым URL-адресом файла хранения, если размер файла очень большой, и перетащите файл на ваш сервер.

0 голосов
/ 29 мая 2018

Возможно, вы столкнулись с ограничением исходящей сети для плана Flame (5 ГБ в месяц).Вы можете перейти на план Blaze для неограниченной сети с платой за использование.

...