Reputation: 1
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
Reputation: 32
Try setting path before setting ejs
app.set('views', path.join(__dirname, 'website/src/views'))
app.set('view engine', 'ejs')
Upvotes: 0