Читайте файл построчно, используя Lambda / S3 - PullRequest
0 голосов
/ 12 октября 2018

Я хочу прочитать файл построчно, расположенный на S3.Я попробовал следующий код, который нашел при поиске в Интернете, но функция Lambda завершает работу, не вызывая никаких обратных вызовов readline.Что я делаю не так?

const aws = require('aws-sdk');
const s3 = new aws.S3({ apiVersion: '2006-03-01' });
const readline = require('readline');

exports.handler = async (event, context, callback) => {
    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,
    };

    const s3ReadStream = s3.getObject(params).createReadStream();

    const rl = readline.createInterface({
      input: s3ReadStream,
      terminal: false
    });

    rl.on('line', (line) => {
      console.log(`Line from file: ${line}`);
    });
    rl.on('error', () => {
        console.log('error');
    });
    rl.on('close', function () {
        console.log('closed');
        context.succeed();
    });
    console.log('done');
};

Ответы [ 2 ]

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

Я нашел проблему.Некоторое время назад я не кодировал лямбду и думал, что она выйдет только при вызове контекста.Я сейчас жду обещания, которое будет выполнено (или отклонено, которое я выполню позже).

const aws = require('aws-sdk');
const s3 = new aws.S3({ apiVersion: '2006-03-01' });
const readline = require('readline');

exports.handler = async (event, context, callback) => {
    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,
    };
    const s3ReadStream = s3.getObject(params).createReadStream();

    const rl = readline.createInterface({
      input: s3ReadStream,
      terminal: false
    });

    let myReadPromise = new Promise((resolve, reject) => {

        rl.on('line', (line) => {
          console.log(`Line from file: ${line}`);
        });
        rl.on('error', () => {
            console.log('error');
        });
        rl.on('close', function () {
            console.log('closed');
            resolve();
        });
    });

    try { await myReadPromise; }
    catch(err) {
        console.log('an error has occurred');
    }

    console.log('done reading!');
};
0 голосов
/ 12 октября 2018

getObject не просто возвращает объект, который был сохранен S3.Он возвращает объект JSON, поле Body которого содержит большой двоичный объект, сохраненный в S3.См. Также в Response части документации здесь .

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