Express app.engine() Method
What you’ll learn
- How to register a template engine using
app.engine(ext, callback). - How engine registration works with
app.set('view engine', ...)andres.render(). - How to configure custom extensions and rendering callbacks.
- How to diagnose common view-engine registration issues.
Overview
app.engine() tells Express how to render files for a specific extension, enabling template engines like EJS, Pug, and others.
Extension mapping
Map file extensions (like .ejs) to render callbacks.
View integration
Works with app.set('views', ...) and res.render() pipeline.
Custom engines
Useful when plugging custom renderers or non-default extensions.
Syntax
javascript
app.engine(ext, callback)- ext: extension without dot in most examples, such as
ejs. - callback: render function signature
(path, options, callback). - Pair with
app.set('view engine', ext)for default rendering behavior.
1
Basic EJS registration
javascript
const express = require('express');
const ejs = require('ejs');
const app = express();
app.engine('ejs', ejs.renderFile);
app.set('view engine', 'ejs');
app.set('views', __dirname + '/views');2
Custom extension mapping
Render custom extension files (like .html) using EJS.
javascript
const express = require('express');
const ejs = require('ejs');
const app = express();
app.engine('html', ejs.renderFile);
app.set('view engine', 'html');
app.get('/', function (req, res) {
res.render('home', { title: 'Custom extension rendering' });
});📋 app.engine() vs app.set('view engine')
| API | Role | Example |
|---|---|---|
app.engine() | Registers how extension is rendered | app.engine('ejs', ejs.renderFile) |
app.set('view engine', ...) | Sets default extension for res.render() | app.set('view engine', 'ejs') |
🧪 Testing checklist
- Register engine and render a simple view to verify output.
- Check `views` path configuration and filename resolution.
- Test one invalid template path to verify error handling.
- Confirm `res.render()` works with expected extension behavior.
Pitfalls to avoid
Missing registration
Render failure
If engine is not registered for extension, Express cannot render that file type.
Wrong views path
Template not found
Set the correct directory via app.set('views', ...).
Confusing API roles
Setup bugs
Remember: app.engine() registers renderer; view engine chooses default extension.
❓ FAQ
It registers a template engine callback for a given file extension.
Not always. For common engines like EJS, app.set('view engine', 'ejs') often works directly. app.engine() is useful for custom registration.
app.engine() registers how files are rendered; app.set('view engine', ...) selects the default extension for res.render().
Yes. You can call app.engine() for different extensions and render matching templates.
Rendering fails with a view-engine related error because Express cannot process that extension.
Summary
- Purpose:
app.engine()registers template render behavior for a file extension. - Integration: combine with
view engineandviewssettings for rendering flow. - Practice: verify registration and path setup to avoid runtime render errors.
Did you know?
app.engine(ext, callback) registers a template rendering function for a file extension, enabling custom or third-party view engines.
4 people found this page helpful
