node.jsexpressejs

how to have express render .ejs files requested by url


So I have a very simple server to test this:

import express from 'express';
const app = express();
app.set('views', './public');
const PORT = 3002;

app.get('/', (req, res) => {
  res.render('index.ejs', { title: 'Page Title'});
});


app.listen(PORT, () => {
  console.log(`Server is running at http://localhost:${PORT}`);
});

What I would like to be able to do is create a link in the index.ejs to, for example, page2.ejs, page3.ejs, etc... and have express render the .ejs reached from the link without having to create a route for each page in my app.js as:

app.get('/page2.ejs', (req, res) => {
  res.render('page2.ejs');
});
app.get('/page3.ejs', (req, res) => {
  res.render('page3.ejs');
});
app.get('/page4.ejs', (req, res) => {
  res.render('page4.ejs');
});

would seem stupidly inefficient...


Solution

  • It would be:

    const viewDir = path.join(__dirname, 'view');
    
    app.get('/', ...);
    
    app.get('/*', (req, res, next) => {
      const viewPath = path.join(viewDir, req.path + '.ejs');
    
      if (viewPath.startsWith(viewDir) && fs.existsSync(viewPath)) {
        res.render(viewPath);
      } else {
        next();
      }
    });
    

    viewPath.startsWith(viewDir) check prevents from accessing files outside the expected location.