Я на самом деле сталкиваюсь с проблемой, когда пытаюсь загрузить файл из хранилища на 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 ...