Ожидание окончания readStream и возврат данных - PullRequest
0 голосов
/ 08 ноября 2018

Это мой код:

downloadFile(file_id) {
    var mongoose = require('mongoose');
    var Grid = require('gridfs-stream');
    var fs = require('fs');

    mongoose.connect(config.db, {useNewUrlParser: true},).catch(e => console.log(e));
    var conn = mongoose.connection;
    Grid.mongo = mongoose.mongo;
    var gfs = Grid(conn.db);
    console.log('downloadfile', file_id);
    var read_stream = gfs.createReadStream({_id: file_id});
    let file = [];
    read_stream.on('data', function (chunk) {
        file.push(chunk);
    });
    read_stream.on('error', e => {
        console.log(e);
    });
    return read_stream.on('end', function () {
        console.log('file', file); // This logs the file buffer
        return file;
    });
}

И вот как я пытаюсь это использовать:

Account.findById(req.params._id)
    .then(async account => {
        const file = await functions.downloadFile(account.employer.logo);
        console.log(file); // This logs the readStream data
        res.render('users/employer/booth', {
            title: 'Employer Booth',
            user: req.user,
            postings: postings,
            employer: account.employer,
            event: event,
            logo: logo,
        });
    });

И я думаю, что было бы легко получить загруженный файл в обратном вызове, но как я могу передать этот файл обратно и подождать выполнения кода?

Так выглядит файл журнала file [ <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 00 fa 00 00 00 fa 08 06 00 00 00 88 ec 5a 3d 00 00 00 01 73 52 47 42 00 ae ce 1c e9 00 00 20 00 ... > ]

Итак, подведем итог. Прямо сейчас код не ждет. Он регистрирует сам readStream, а затем регистрирует данные файла. Как я могу заставить его ждать окончания потока и возвращать файл на мой маршрутизатор?

1 Ответ

0 голосов
/ 08 ноября 2018

Оберните вашу downloadFile функцию в объект обещания и разрешите ее только после полного чтения файла и в случае ошибки reject обещание.

Обновить код

downloadFile(file_id) {
    return new Promise((resolve,reject) => {
        var mongoose = require('mongoose');
    var Grid = require('gridfs-stream');
    var fs = require('fs');

    mongoose.connect(config.db, {useNewUrlParser: true},).catch(e => console.log(e));
    var conn = mongoose.connection;
    Grid.mongo = mongoose.mongo;
    var gfs = Grid(conn.db);
    console.log('downloadfile', file_id);
    var read_stream = gfs.createReadStream({_id: file_id});
    let file = [];
    read_stream.on('data', function (chunk) {
        file.push(chunk);
    });
    read_stream.on('error', e => {
        reject(e);
    });
    return read_stream.on('end', function () {
        console.log('file', file); // This logs the file buffer
        resolve(file);
    });
 });    
}
...