Fulminate Class-Based View Router
This package introduces class-based views (controllers) for Express.js. Designed to be used with TypeScript.
Heavily inspired by Django's class based views.
This is a full revision of previously published Fulminate Router. To install current version:
npm i --save @fulminate/router
To use the deprecated version, install it with:
npm i @fulminate/router@1.1.6
Migration guide (1.x.x to 2.x.x)
No migration. Its a 100% redone package.
Example of use:
You first need to wire up the server. Fulminate class-based views wrap up Express server. If you've already started
working with Express, you can simply inject your code into Fulminate CBV without rewriting.
Creating brand-new express server with Fulminate Router
import * as morgan from 'morgan';
import { FulminateRouter } from '@fulminate/router';
const fS = new FulminateRouter();
fS.registerViews(__dirname, [ /\/*.controller.js$/ ]);
fS.wireUp();
const server = fS.getServer();
server.use(morgan('dev'));
server.set('view engine', 'ejs')
.set('views', './')
.engine('.html', require('ejs').renderFile)
;
server.listen(3000);
Injecting existing Express server into Fulminate Router
import * as express from 'express';
import * as morgan from 'morgan';
import { FulminateRouter } from '@fulminate/router';
const server = express();
server.use(morgan('dev'));
server.set('view engine', 'ejs')
.set('views', './')
.engine('.html', require('ejs').renderFile)
;
const fS = new FulminateRouter(server);
fS.registerViews(__dirname, [ /\/*.controller.js$/ ]);
fS.wireUp();
const server = fS.getServer();
fS.getServer().listen(3000);
Examples of view classes
import { Body, ClassBasedView, GetCookies, GetHeaders, QueryParams, RequestParams, SetCookie, SetHeader } from '@fulminate/class-based-view';
@ClassBasedView({
route: '/',
asJson: true,
})
@SetHeader({ key: 'X-Powered-By', value: 'Someone_Else' })
@SetHeader({ key: 'Authorization', value: 'ThisIsToken' })
export class TestView {
@GetCookies()
private _cookies: object;
public title = 'TestView works!';
public get cookies(): object {
return this._cookies;
}
}
@ClassBasedView({
route: '/:param',
template: 'index.html',
})
export class Test2View {
@SetCookie() cookieTheAnswer = '42';
@SetCookie() whatsHerName = 'noname';
public title: string;
@GetHeaders()
private headers: object;
@QueryParams({ required: true })
private queryParams: object;
@GetCookies({ required: true, explicitly: [ 'cookieTheAnswer' ]})
private cookies: object;
@RequestParams()
private requestParams: object;
public constructor() {
this.title = 'Test2View works!'
}
}
@ClassBasedView({
route: '/',
method: 'POST',
asJson: true,
})
export class TestPostView {
public name: string = "TestPostView works!";
@Body()
private body;
}