Ron I
Ron I

Reputation: 4250

How to get a random image from the images directory in an express environment

I wanted to randomly get an image from the images directory. However, my current code is not working. Any help is appreciated!

var express = require('express');
var router = express.Router();
const fs = require('fs');

function getRandFile() {
  const imageDir = '../public/images/';
  fs.readdir(imageDir, (err, files) => {
  files.forEach(file => {
    //will add file name to an array and then return a random file name
  });
})

}

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('./index.jade', { backgroundImage:getRandFile() });
});

module.exports = router;

The error I get is:

/Users/ron/Dropbox/dev/moments/routes/index.js:9
  files.forEach(file => {
       ^

TypeError: Cannot read property 'forEach' of undefined
    at fs.readdir (/Users/ron/Dropbox/dev/moments/routes/index.js:9:8)
    at FSReqWrap.oncomplete (fs.js:111:15)

The directory structure is:

/
 /public
   /images
     | 1.jpg
     | 2.jpg
     | etc
 /routes
   | index.js <-- where I am calling the function getRandFile()

Upvotes: 1

Views: 2012

Answers (1)

Brandon Horst
Brandon Horst

Reputation: 2070

Unlike the require function, fs.readdir (and all fs functions) works relative to the current working directory, not necessarily directory the current script is in. Where the current working directory is depends on how the Node process was started.

If you want access files relative to the current directory, you can use the built-in __dirname global instead, which always contains the path to the currently-executing file.

var path = require('path')

const imageDir = path.resolve(__dirname, '../public/images/')

Upvotes: 1

Related Questions