等到readStream结束并返回数据

时间:2018-11-08 15:13:13

标签: javascript node.js asynchronous stream

这是我的代码:

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 :(得分:1)

downloadFile函数包装到Promise对象中,并且仅在完全读取文件并且在发生错误reject Promise的情况下解析。

更新代码

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);
    });
 });    
}