Ошибка обратного вызова не используется для chained then () с ssh2-sftp-client в node.js lambda

cninsd спросил: 14 ноября 2017 в 06:30 в: node.js

Я очень новичок в узлах и лямбдах, поэтому я, вероятно, допускаю некоторые глупые ошибки. Я создал лямбда-функцию node.js aws, которая получает файл из события s3. Если файл gzip распаковывается, загружает его на сервер sftp, затем создает и загружает файл sig на тот же сервер sftp. Он работает, когда все идет хорошо, но, похоже, он не корректно вызывает ошибки.

Команды sftp объединяются в цепочку с помощью then, поэтому я ожидаю, что любая ошибка завершится ошибкой в ​​последующем. Например, если я выключу свой сервер sftp, клиент sftp выдаст ошибку тайм-аута, но lambda никогда не увидит ошибку обратного вызова, только успех. Журнал показывает вывод ошибок на консоль, но, похоже, использует обратный вызов успеха после выполнения остальных элементов .then (). Не правильно ли соединение записано как обещание?

Пример журнала:

...
Starting SFTP
Connected to sftp, starting sftp put for lastsub2.dat file.
{ Error: Timed out while waiting for handshake
    at Timeout._onTimeout (/var/task/node_modules/ssh2/lib/client.js:687:19)
    at ontimeout (timers.js:386:14)
    at tryOnTimeout (timers.js:250:5)
    at Timer.listOnTimeout (timers.js:214:5) level: 'client-timeout' } 'Error occured during sftp relay.'
END

Пример кода:

console.log('Loading function');
const aws = require('aws-sdk');
const s3 = new aws.S3({
    apiVersion: '2006-03-01'
  });
const zlib = require('zlib');
const fs = require("fs");
const connSettings = {
  host: 'xxx',
  port: '22',
  username: 'xxx',
  password: 'xxx'
};exports.handler = function (event, context, callback) {
  console.log('Received event:', JSON.stringify(event, null, 2));
  console.log('Bucket Name: ' + event.Records[0].s3.bucket.name);
  console.log('Object Key: ' + decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' ')));
  const bucket = event.Records[0].s3.bucket.name;
  const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
  const params = {
    Bucket: bucket,
    Key: key,
  };  s3.getObject(params, (err, data) => {
    if (err) {
      console.log(err);
      const message = 'Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.';
      console.log(message);
      callback(message);
    } else {
      if (data.ContentType == 'application/x-gzip') {
        console.log('CONTENT TYPE is application/x-gzip');
        var dataStream = s3.getObject(params).createReadStream().pipe(zlib.Unzip());
        console.log('Created unzip datastream');
        console.log('Starting SFTP');
        let Client = require('ssh2-sftp-client');
        let sftp = new Client();
        sftp.connect(connSettings)
        .then(console.log('Connected to sftp, starting sftp put for ' + key.replace('.gz', '.dat') + ' file.'))
        .then(() => {
            console.log('Finished sftp put for ' + key.replace('.gz', '.dat') + ' file.');
            return sftp.put(dataStream, key.replace('.gz', '.dat'), true, 'utf-8');
        }).then(() => {
          var sigFileName = key.replace('.gz', '.sig');
          var sigStream = fs.createWriteStream('/tmp/' + sigFileName);
          sigStream.end();
          console.log('Created ' + sigFileName + ' sig file.');
          var readStream = fs.createReadStream('/tmp/' + sigFileName);
          console.log('Uploaded ' + sigFileName + ' sig file.');
          return sftp.put(readStream, sigFileName, true, 'utf-8');
        }).then(() => {
            console.log('Ended sftp connection.');
            return sftp.end();
        })
        .then(callback(null, 'Success'))
        .catch ((err) => {
          console.log(err, 'Error occured during sftp relay.');
          callback('Error', err);
        });
      } else {
        callback(null, 'Uploaded file not in gzip format, will not be processed.');
      }
    }
  });
};

0 ответов