AWS S3 CreateReadStream в al oop только читает и пишет 1 файл - PullRequest
1 голос
/ 07 февраля 2020

Я пытаюсь извлечь несколько файлов из S3 с использованием readstream и локально вставить их в один файл.

Ниже переменная 'output' - это единственный записывающий поток, к которому я добавлю sh используя загруженные данные файла S3.

Я перебираю дни, когда переменная nextDay используется для клавиши S3. Fileservice.s3Handler.getS3Obj возвращает объект S3, который позволяет читать поток для одного файла и добавлять его в выходной файл. Однако никакие другие файлы не читаются и не отображают консоль с использованием метода on ('data', ()). Я пытался обернуть поток чтения в обещание, чтобы попытаться дождаться окончания чтения, но он запускает ту же ошибку.

В последнее время я получаю эту ошибку: "ERR_STREAM_WRITE_AFTER_END"

Не конечно, что здесь не так.

async fetchCSV(req, res) {

    const output = fs.createWriteStream(outputPathWithFile, {
                   'flags': 'a'});

    let nextDay = startDate;

    while (nextDay !== endDate) {

        const s3path = path.join(`${req.params.stationId}`, `${nextDay}.csv`);

        const file = await this.fileService.s3Handler.getS3Obj(s3path);

        await this.completePipe(file, output);

        nextDay = await getTomorrow(nextDay);
    }

}

completePipe(file, output) {
    return new Promise((resolve) => {
        file.createReadStream().on('finish', () => {
            resolve();

        }).on('error', (err) => {
            resolve();

        }).on('data', (data) => {
            console.log(data.toString());

        }).pipe(output);
    })
}

}

getS3Obj(file) {

    return new Promise(async (resolve) => {

            const getParams = {
                Bucket: this.bucket,
                Key: file
            };
            resolve(this.s3.getObject(getParams, (err) => {

                if (err) {
                    console.log('Error in getS3 object')
                }
            }));


    })
}

Пожалуйста, помогите мне?

1 Ответ

1 голос
/ 07 февраля 2020

Решено.

Сделал пару вещей:

  1. Добавлен тег в метод pipe.

    stream.pipe (output, { end: false})

  2. Вместо того, чтобы создавать новую функцию для обещания, я просто вставил вместо этого код:

    await new Promise((resolve) => {
        stream.once('finish',  () => {
            resolve();
        });
    });
    

Но тег был тем, что заставляло его работать, обещание было просто аккуратно.

Yay.

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