GridFS не пишет в mongodb, используя mongoose - PullRequest
0 голосов
/ 22 апреля 2019

Я использую MEAN стек для написания приложения.Одной из функций является предоставление изображений пользователям.Я могу добиться этого, используя мой следующий код.

Однако у меня есть еще одна особенность.Если запрошенное изображение отсутствует в моей базе данных, я получу фактический URL-адрес изображения из другой коллекции, загрузю изображение, загрузю его на мой mongodb и предоставлю это изображение пользователю.

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

var mongoose = require('mongoose');
var mongo = require('mongodb');
let Grid = require('gridfs-stream');
let gfs = Grid(mongoose.connection,mongo);
let articles = require('../controllers/articles');
var https = require('https');
var fs = require('fs');

var download = function(url, dest, cb) {
    console.log("Downloading");
    var file = fs.createWriteStream(dest);

    file.on('open',function (fd){
        console.log("created file "+fd)
        https.get(url, function(response) {
            response.pipe(file);
            file.on('finish', function() {
                file.close();
                cb(file);
            });
        });
    });
};

function downloadAndSaveImage(image,callback) {
    console.log("Init download");
    article = articles.getArticlesById(image, function (article) {
        download(article['imageUrl'],'/home/rsa-key-20190326/snap/server/res/image/'+image+'.jpg',function (file) {
            console.log("Downloaded");
            var writestream = gfs.createWriteStream({
                filename: image,
                content_type: 'image/jpg',
                mode: 'w'
            });
            console.log("Created stream "+writestream);
            writestream.on('close', function (file) {
                console.log("close");//doesn't get logged
                callback(file);
            });

            console.log(file.path); //this gets logged
            fs.createReadStream(file.path)
                .pipe(writestream);

        });
    });
}

//4.7.3
exports.getImage = function(req, res) {
    console.log("Got request");
    gfs.files.find({filename: req.params.image}).toArray(function(err, files){

        if(!files || files.length === 0){
            console.log("Doesnt exist");

            downloadAndSaveImage(req.params.image, function (file) {
                console.log("Saved");
                var readstream = fs.createReadStream(file.path);
                // set the proper content type
                res.set('Content-Type', 'image/jpg');
                // Return response
                console.log("Returned");
                return readstream.pipe(res);
            });
        }else{
            console.log("Exist");
            var readstream = gfs.createReadStream({
                filename: files[0].filename,
            });
            readstream.on('error', function (err) {
                console.log('An error occurred!', err);
                throw err;
            });

            return readstream.pipe(res);
        }
    });
};

Это журнал консоли, чтобы помочь понятьflow:

Doesnt exist
Init download
Downloading
created file 15
Downloaded
Created stream [object Object]
path/to/file

Как видите, событие 'close' никогда не вызывается.Когда я проверял БД, изображение не сохранялось.

...