MongoDB GridFS, загрузка изображения всегда возвращает только последнее изображение из набора изображений - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь получить набор изображений, хранящихся в mongoDB, используя mongoose и GridFS.Я храню имена файлов в массиве и зацикливаюсь, чтобы получить каждое из них и сохранить его по локальному пути.Однако, только последнее изображение загружается и сохраняется, цикл выполняется правильно, но только последнее имя файла выполняется в каждой итерации.

Здесь имя файла внутри gfs.exist () всегда sony4, и оно выполняется на каждой итерациии только то, что загружается.

const express = require('express')
const bodyParser = require('body-parser')
const cors = require('cors');
const app = express()
const mongoose = require('mongoose')
var gridfs = require('gridfs-stream');
var fs = require('fs');
mongoose.Promise = Promise
gridfs.mongo = mongoose.mongo;

mongoose.connect('mongodb://localhost:27017/CompanyDetails', { useNewUrlParser: true })
    .then(() => console.log("mongoose is up"))

let connection = mongoose.connection;

connection.on('error', function (err) {
    console.log(err);
})

app.use(cors())
app.use(bodyParser.json())

connection.once('open', () => {

    var gfs = gridfs(connection.db);
    app.get('/api/download', async (req, res) => {


        var filenames = ['asus1.jpg', 'asus2.jpg', 'asus3.jpg', 'asus4.jpg',
            'dell1.jpg', 'dell2.jpeg', 'dell3.jpg', 'dell4.png',
            'hp1.jpg', 'hp2.jpg', 'hp3.jpg', 'hp4.jpg',
            'lenovo1.jpg', 'lenovo2.jpg', 'lenovo3.jpg', 'lenovo4.jpg',
            'sony1.jpg', 'sony2.jpg', 'sony3.jpg', 'sony4.jpg'];

        for (var i = 0; i < filenames.length; i++) {
            var filename = filenames[i];
            console.log(filenames[i]);

            // Check file exist on MongoDB
            gfs.exist({ filename: filename }, (err, file) => {
                if (err || !file) {
                    res.status(404).send('File Not Found');
                    return
                }

                var readstream = gfs.createReadStream({ filename: filename });
                var fs_write_stream = fs.createWriteStream('D:/data/db/images/' + filename);
                readstream.pipe(fs_write_stream);
            });
        }
    });
})

app.listen(1234, () => console.log("Server listening at 1234"))
...