Облачный функциональный узел Google JS SFTP в облачное хранилище Ошибка передачи файла - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь запустить следующий код, используя библиотеку узлов ssh2-sftp, но не получаю никакой ошибки от консоли GCP. Здесь я пытаюсь передать данные, полученные от SFTP, в выходной файл в GCS.

Вот код:

  /**
 * Generic background Cloud Function to be triggered by Cloud Storage.
 *
 * @param {object} event The Cloud Functions event.
 * @param {function} callback The callback function.
 */

let request = require("request");
let Storage = require('@google-cloud/storage');
let Client = require('ssh2-sftp-client');
let sftp = new Client();
const fs = require('fs');
const path = require('path');
const storage = new Storage({projectId: process.env.PROJECT_ID});

exports.retrieveFilesFromSFTP = (event, callback) => {


    let pubsubMessage = event.data;
    let fileName = pubsubMessage.data
        ? Buffer.from(pubsubMessage.data, 'base64').toString()
        : 'No Files in pubsub';


    console.log(fileName, 'File name from Pub/Sub Message was received');


    fs.readdir(__dirname, (err, files) => {
        if (err) {
            console.error(err);
            res.sendStatus(500);
        } else {
            console.log('Files', files);
            res.sendStatus(200);
        }
    });

    getFilesFromSFTP(fileName);
    callback();
};

function getFilesFromSFTP(fileName) {

    const bucket = storage.bucket('dataflowdirectory');

    const outFile = bucket.file("relex_output/"+fileName);

    //TODO create a file on the bucket , get the correct file path and then pipe it to the file

    sftp.connect({
        host: process.env.SFTP_SERVER,
        port: process.env.SFTP_PORT,
        username: process.env.SFTP_USER,
        password: process.env.SFTP_PASSWORD
    }).then(() => {


        sftp.list(process.env.SFTP_OUTBOUND_PATH)
            .then((data) => {

                sftp.get(process.env.SFTP_OUTBOUND_PATH + "/" + fileName).then((data) => {

                    data.pipe((outFile.createWriteStream({gzip: true})
                        .on('error', function (err) {
                            console.error("error",err);
                        })
                        .on('finish', function () {
                            // The file upload is complete.
                            outFile.close();
                        })));

                });

            }).catch((err) => {
            console.log(err);

        });

    })

}

Единственное, что я вижу из журнала, это следующее: Игнорирование исключения из готовой функции

Есть идеи, как решить эту проблему?

Спасибо

1 Ответ

0 голосов
/ 28 января 2019

Я могу решить это с помощью следующего кода, Я добавил полный путь к файлу: relex_output Это все еще очень, очень медленно, поэтому любое улучшение производительности будет оценено:

/**
 * Generic background Cloud Function to be triggered by Cloud Storage.
 *
 * @param {object} event The Cloud Functions event.
 * @param {function} callback The callback function.
 */

let request = require("request");
let Storage = require('@google-cloud/storage');
let Client = require('ssh2-sftp-client');
let sftp = new Client();
const fs = require('fs');
const storage = new Storage({projectId: process.env.PROJECT_ID});

exports.retrieveFilesFromSFTP = (event, callback) => {


    let pubsubMessage = event.data;
    let fileName = pubsubMessage.data
        ? Buffer.from(pubsubMessage.data, 'base64').toString()
        : 'No Files in pubsub';


    console.log(fileName, 'File name from Pub/Sub Message was received');


    fs.readdir(__dirname, (err, files) => {
        if (err) {
            console.error(err);
            res.sendStatus(500);
        } else {
            console.log('Files', files);
            res.sendStatus(200);
        }
    });

    getFilesFromSFTP(fileName);
    callback();
};

function getFilesFromSFTP(fileName) {

    const bucket = storage.bucket('dataflowdirectory');

    const outFile = bucket.file("relex_output/"+fileName);



    sftp.connect({
        host: process.env.SFTP_SERVER,
        port: process.env.SFTP_PORT,
        username: process.env.SFTP_USER,
        password: process.env.SFTP_PASSWORD
    }).then(() => {


        sftp.list(process.env.SFTP_OUTBOUND_PATH)
            .then((data) => {

                sftp.get(process.env.SFTP_OUTBOUND_PATH + "/" + fileName).then((data) => {

                    data.pipe((outFile.createWriteStream({gzip: true})
                        .on('error', function (err) {
                            console.error("error",err);
                        })
                        .on('finish', function () {
                            // The file upload is complete.
                            sftp.end();
                        })));

                });

            }).catch((err) => {
            console.log(err);

        });

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