GridFS / multer - Невозможно прочитать свойство 'filename' из неопределенного - PullRequest
0 голосов
/ 11 ноября 2019

Я не большой специалист по веб-разработке (по крайней мере, на данный момент, надеюсь), поэтому мой вопрос может быть немного глупым.

Вот моя проблема: я работал над 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")
    }
});

1 Ответ

0 голосов
/ 11 ноября 2019

Это будет работать для вас, пример кода

const multer = require('multer');   //FOR FILE UPLOAD

let storage = multer.diskStorage({ //multers disk storage settings
  destination: function (req, file, cb) {
    cb(null, './public');
  },
  filename: function (req, file, cb) {
    let datetimestamp = Date.now();
    cb(null, file.originalname);
  }
});

let upload = multer({ //multer settings
  storage: storage
}).single('file');


let uploadfile = (req, res, next) => {
  let path = '';
  upload(req, res, function (err) {
    if (err) {
      return res.status(422).send("an Error occured");
    }
    let path = req.file.path;
    req.file = path;
    next();

  });
}
...