0

mongoose と GridFS を使用して、mongoDB に保存されている一連の画像を取得しようとしています。ファイル名を配列に保存し、ループしてそれぞれを取得してローカルパスに保存しています。ただし、最後の画像のみがダウンロードされて保存され、ループは正しく実行されますが、各反復で最後のファイル名のみが実行されます。

ここで 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"))
4

0 に答える 0