等到readStream结束并返回数据 [英] Waiting until readStream has ended and returning the data

查看:70
本文介绍了等到readStream结束并返回数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的代码:

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

这就是我试图使用它的方式:

And this is how I'm trying to use it:

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

我想在回调中获取下载的文件会很容易,但是如何才能将该文件传回,并等待代码执行呢?

And I guess it would be easy to get the downloaded file in a callback, but how can I pass this file back, and make the code execution wait?

这就是记录的文件的外观 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 ec5a 3d 00 00 00 01 73 52 47 42 00 ae ce 1c e9 00 00 20 00 ...]

This is how the logged file looks like 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本身,然后记录文件数据.如何让它等待流结束并将文件返回到路由器?

So to summarize. Right now, the code doesn't wait. It logs the readStream itself, and then logs the file data. How can I make it wait for the stream to end and return the file to my router?

推荐答案

将您的 downloadFile 函数包装到Promise对象中,并且仅在完全读取文件并且出现错误 reject的情况下解析诺言.

Wrap your downloadFile function into promise object and resolve only after completely read of file and in case of error reject the 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);
    });
 });    
}

这篇关于等到readStream结束并返回数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆