How can I prevent express-ejs-layouts for wrapping my other page?

Viewed 1869

I'm finding a page layout for node.js like laravel php have their Template for layout and it is perfect. I want to achieve it here in node.js and finally found this express-ejs-layouts but there is a problem in it that I cant see in their documentation the layout will wrap all of my pages specially my signin and signup page which have a different header and footer. How can we prevent express-ejs-layouts from wrapping my other page?

const express = require('express');
const router = express.Router();
const path = require('path');
const multer = require('multer');
const bodyParser = require('body-parser');
const mysql = require('mysql');
const app = express();
const server = require('http').createServer(app);
const expressLayouts = require('express-ejs-layouts');

// Set Database Connection
const connection=mysql.createConnection({
    host:'localhost',
    user:'root',
    password:'',
    database:'project_101'
});

connection.connect(function(error){
    if(!!error) console.log(error);
    else console.log('Database Connected!');
});

app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.static('assets'));
app.use(bodyParser.json());       
app.use(bodyParser.urlencoded());
app.use(bodyParser.urlencoded({extended: true}));
app.use(expressLayouts);

app.get('/',(req, res) => {
    let sql = "SELECT * FROM uploads";
    let query = connection.query(sql, (err, rows) => {
        if(err) throw err;
        res.render('index');
    });
});

app.get('/signup', (req, res) => {
    res.render('signup');
});

app.get('/signin', (req, res) => {
    res.render('signin');
});

app.get('/unknown-user', (req, res) => {
    res.render('unknown-user');
});

app.get('/profile', (req, res) => {
    res.render('profile');
});

const port = process.env.PORT || 3000;

// Server Listening
server.listen(port, function () {
    console.log('Server successfully running at: -',port);
});
2 Answers

Finally got the solution for the problem express-ejs-layouts

const express = require('express');
const expressLayouts = require('express-ejs-layouts');

app.use(expressLayouts);

You just need to declare your page as a layout and set it to false.

app.set("layout signin", false);

and render the page together with the layout.

app.get('/signin', (req, res) => {
    res.render('signin', { layout: 'signin' });
});

ez fix ⚡️

You can bypass the template by sending the file back.

res.sendFile(path, options, fn);

options and fn are optional.

Related