Я не большой специалист по веб-разработке (по крайней мере, на данный момент, надеюсь), поэтому мой вопрос может быть немного глупым.
Вот моя проблема: я работал над Node.Js и пытается создать базу данных, в которую я могу загрузить изображения, чтобы затем извлечь их и показать их в браузере с помощью файла .ejs.
К сожалению, в то время как в файле app.js я могу использовать console.logмассив images
и проверьте наличие filename
хотя бы одного файла, просматривая его в документе .ejs, выполнив следующее:
`<% for(var i = 0; i <= images.length; i++){ %>
<img src="<%= images[i].filename %>">
<% } %>`
я получаю ошибку, как показано в заголовкеэтого вопроса.
Кто-нибудь знает, что я делаю не так? Я считаю, что я установил что-то не так с GridFS или multer, но я не уверен на 100%.
Заранее спасибо всем, кто ответит.
Здесь вы можете найти код, который я использую в файле app.js на данный момент:
var express = require('express'),
mongoose = require('mongoose'),
bodyParser = require('body-parser'),
methodOverride = require('method-override'),
expressSanitizer = require('express-sanitizer'),
path = require('path'),
crypto = require('crypto'),
multer = require('multer'),
GridFsStorage = require('multer-gridfs-storage'),
Grid = require('gridfs-stream'),
app = express();
//connect to the MongoDB database
mongoose.connect("mongodb+srv://***:*****@cluster-***-***-q5eof.mongodb.net/*****?retryWrites=true&w=majority",
{ useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false,
useCreateIndex: true});
//connect to the MongoDB database
var mongoURI = "mongodb+srv://***:*****@cluster-***-***-q5eof.mongodb.net/*****?retryWrites=true&w=majority";
var conn = mongoose.createConnection(mongoURI)
//parseing incoming request bodies in a middleware before the handlers, available under the req.body property
app.use(bodyParser.urlencoded({extended: true}));
//setting the engine to read directly the ejs files without specifying their extentions on the routes
app.set('view engine', 'ejs');
//serving images, CSS files, and JavaScript files in a directory named public:
app.use(express.static('public'));
//setting method-override to be used via '_method' text before specifying the type of method used in a form
app.use(methodOverride('_method'));
//execute express-sanitizer
app.use(expressSanitizer());
let gfs
conn.once('open', () => {
gfs = Grid(conn.db, mongoose.mongo)
gfs.collection('uploads')
console.log('GRID CONNECTION SUCCESSFUL')
})
//Landing page
app.get('/', function(req, res){
gfs.files.find().toArray(function(err, images){
if(err){
console.log(err)
} else {
images.map(function(image){
image.isImage = true;
});
}
res.render('landing', {images: images});
console.log(images[0].filename);
});
});
//Create storage engine
var storage = new GridFsStorage({
url: mongoURI,
file: (req, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(16, (err, buf) => {
if (err) {
return reject(err);
}
const filename = buf.toString('hex') + path.extname(file.originalname);
const fileInfo = {
filename: filename,
bucketName: 'uploads'
};
resolve(fileInfo);
});
});
}
});
const upload = multer({ storage });
//Upload page
app.get('/upload', function(req, res){
res.render('upload');
});
//Sending form from upload page
app.post('/upload', upload.array('file'), function(req, res){
res.json({file: req.files});
});
app.listen('3000', function(err){
if(err){
console.log(err)
} else{
console.log("APP CONNECTED")
}
});