Я использую 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' никогда не вызывается.Когда я проверял БД, изображение не сохранялось.