Templating & Assets
Static Assets
Serve files from a directory (like ./public) automatically.
javascript
// Serve files from the 'public' folder at the root
// Serve files from the 'public' folder at the root (Default)
app.ASSETS('./public');
// -> GET /style.css maps to ./public/style.css
// Or with a prefix
app.ASSETS('./public', { prefix: '/static' });
// -> GET /static/style.css maps to ./public/style.css
// -> GET /style.css maps to ./public/style.css
// Or with a prefix
app.ASSETS('./public', { prefix: '/static' });
// -> GET /static/style.css maps to ./public/style.cssThis feature handles:
- Mime Types
- Caching (ETag, Last-Modified)
- Compression
- Range Requests (video streaming support)
Sending Files Manually
You can send a specific file from any route handler.
javascript
app.GET('/download/report', async (req, res) => {
await res.sendFile('./data/report.pdf', {
maxAge: 3600, // 1 hour cache
headers: { 'Content-Disposition': 'attachment' }
});
});Templating (Nunjucks)
Routerling integrates Nunjucks for server-side rendering.
Setup
javascript
app.TEMPLATES('./views', {
autoescape: true,
noCache: process.env.NODE_ENV !== 'production'
});Rendering
Use res.render (async) or res.renders (sync).
javascript
app.GET('/home', async (req, res) => {
await res.render('home.html', {
title: 'Welcome',
user: 'John Doe'
});
});Template Context
Templates automatically receive:
req: The request objectres: The response objectctx: The context objectctx.flash: Flash messages (if used)
Using Flash Messages
Routerling provides a flash middleware to store ephemeral messages between requests (e.g. for redirects).
Setup
javascript
import { flash } from 'routerling';
app.use(flash());Usage in Handlers
Use res.flash(type, message) to set a message for the next request.
javascript
app.POST('/login', async (req, res) => {
// ... login logic ...
res.flash('success', 'Successfully logged in!');
res.redirect('/dashboard');
});Usage in Templates
Flash messages are available in ctx.flash.
html
<!-- Nunjucks example -->
{% if ctx.flash.success %}
<div class="alert alert-success">
{% for msg in ctx.flash.success %}
<p>{{ msg }}</p>
{% endfor %}
</div>
{% endif %}