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"))