Nicola Marizza
Nicola Marizza

Reputation: 1

EJS: app.set('views', viewsPath) has no effect

Dependencies:

"ejs": "^3.1.9",
"express": "^4.18.2",

My folder structure is the following:

/usr/src/app/
 |
 |- app.js
 |- api/routers/main.js
 |- website
    |- src/views/myView.ejs
    |- routers
       |- main.js
       |- root.js
       |- resources.js

In app.js I set up EJS like so:

import webRouter from './website/routers/main.js'
import apiRouter from './api/routers/main.js'

const __dirname = path.dirname(fileURLToPath(import.meta.url))
const app = express()
const port = 80

app.set('view engine', 'ejs')
app.set('views', path.join(__dirname, 'website/src/views'))

app.use('/', webRouter)
app.use('/api', apiRouter)


app.listen(port, () => [
    console.log('App is listening on port ' + port)
])

Taking webRouter as an example, it builds a router from multiple files like so:

import Router from 'express'
import root from './root.js'
import resources from './resources.js'
// ...

const router = Router()

root(router)
resources(router)
// ...

export default router

And finally, taking a simplified root.js as an example:

export default (router) => {
    router.get('/', (req, res) => {
        res.redirect('/myView')
    })
    router.get('/myView', (req, res) => {
        res.render('myView')
    })
}

At runtime the path I passed to app.set correctly resolves to /usr/src/app/website/src/views.

When the request comes through, the following exception is raised:

server-1  | Error: Failed to lookup view "myView" in views directory "/usr/src/app/views"
server-1  |     at Function.render (/usr/src/app/node_modules/express/lib/application.js:597:17)
server-1  |     at ServerResponse.render (/usr/src/app/node_modules/express/lib/response.js:1039:7)
server-1  |     at file:///usr/src/app/website/routers/root.js:3:13
server-1  |     at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
server-1  |     at next (/usr/src/app/node_modules/express/lib/router/route.js:144:13)
server-1  |     at Route.dispatch (/usr/src/app/node_modules/express/lib/router/route.js:114:3)
server-1  |     at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
server-1  |     at /usr/src/app/node_modules/express/lib/router/index.js:284:15
server-1  |     at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:346:12)
server-1  |     at next (/usr/src/app/node_modules/express/lib/router/index.js:280:10)

It looks like EJS completly ignored my app.set directive and defaulted to /usr/src/app/views. Am I missing something?

I already tried swapping app.set('view engine') with app.set('views') but the issue persisted. I also tried logging app.get('views') which correctly returned the provided path, just to make sure it wasn't an express issue.

Upvotes: 0

Views: 92

Answers (1)

usama sattar
usama sattar

Reputation: 32

Try setting path before setting ejs

app.set('views', path.join(__dirname, 'website/src/views'))
app.set('view engine', 'ejs')

Upvotes: 0

Related Questions