master
Version:
Master is a node web-application framework that includes everything needed to create database-backed web applications according to the Model-View-Controller (MVC) pattern
426 lines (327 loc) • 9.95 kB
Markdown
This guide will help you get started with MasterController and its new middleware pipeline system.
```bash
npm install mastercontroller
```
```
your-project/
├── server.js
├── config/
│ ├── initializers/
│ │ ├── config.js
│ │ ├── cors.json
│ │ ├── mime.json
│ │ └── request.json
│ ├── routes.js
│ └── load.js
├── middleware/
│ ├── 01-logger.js
│ ├── 02-api-auth.js.example
│ └── 03-admin-auth.js.example
├── app/
│ ├── controllers/
│ │ └── homeController.js
│ ├── views/
│ │ ├── layouts/
│ │ │ └── master.html
│ │ └── home/
│ │ └── index.html
│ └── assets/
│ ├── javascripts/
│ ├── stylesheets/
│ └── images/
└── package.json
```
```javascript
var master = require('mastercontroller');
// Environment setup
master.environmentType = process.env.master || process.env.NODE_ENV || 'development';
master.root = __dirname;
// Setup server (internal tools are auto-loaded)
var server = master.setupServer("http");
// Load configuration
require("./config/initializers/config");
master.start(server);
```
**Note:** `addInternalTools()` is no longer needed - tools are auto-loaded!
```javascript
var master = require('mastercontroller');
var mimes = require('./mime.json');
var request = require('./request.json');
var cors = require('./cors.json');
// 1. MIDDLEWARE REGISTRATION (New!)
master.cors.init(cors); // Auto-registers with pipeline
master.sessions.init(); // Auto-registers with pipeline
master.pipeline.discoverMiddleware('middleware'); // Auto-discover custom middleware
// 2. FRAMEWORK CONFIGURATION
master.request.init(request);
master.error.init(master.env.error);
master.router.addMimeList(mimes);
master.socket.init();
// 3. SERVER SETTINGS
master.serverSettings(master.env.server);
// 4. DEPENDENCY INJECTION (Optional)
// master.addSingleton('db', DatabaseConnection);
// master.addScoped('logger', RequestLogger);
// master.addTransient('email', EmailService);
// 5. LOAD ROUTES
master.startMVC("config");
```
```javascript
var master = require('mastercontroller');
var router = master.router.start();
// Basic route
router.route("/", "home#index", "get");
// Route with parameters (casing preserved!)
router.route("/users/:userId", "users#show", "get");
// RESTful resources (generates 7 routes)
router.resources("posts");
// Route with constraint
router.route("/admin", "admin#index", "get", function(obj) {
if (!isAuthenticated(obj)) {
obj.response.statusCode = 401;
obj.response.end('Unauthorized');
return;
}
this.next();
});
```
```javascript
const master = require('mastercontroller');
class homeController {
constructor(requestObject) {
this.requestObject = requestObject;
// Before/After action filters
this.beforeAction(["edit", "update"], function(obj) {
if (!isAuthenticated(obj)) {
obj.response.statusCode = 401;
obj.response.end('Unauthorized');
return;
}
this.next();
});
}
index(obj) {
// Access route parameters (casing preserved!)
const userId = obj.params.userId;
// Access query string
const search = obj.params.query.search;
// Access form data
const email = obj.params.formData.email;
// Access DI services
// const users = this.db.query('SELECT * FROM users');
// Render view
this.render('index', {
title: 'Home',
users: []
});
}
show(obj) {
const id = obj.params.id;
this.render('show', { id });
}
create(obj) {
const data = obj.params.formData;
// Save data...
this.redirect('/home');
}
api(obj) {
this.json({
success: true,
data: { message: 'API response' }
});
}
}
module.exports = homeController;
```
```javascript
module.exports = async (ctx, next) => {
const start = Date.now();
console.log(`→ ${ctx.type.toUpperCase()} ${ctx.request.url}`);
await next();
const duration = Date.now() - start;
console.log(`← ${ctx.response.statusCode} (${duration}ms)`);
};
```
```javascript
module.exports = {
register: (master) => {
master.pipeline.map('/api/*', (api) => {
api.use(async (ctx, next) => {
const token = ctx.request.headers['authorization'];
if (!token) {
ctx.response.statusCode = 401;
ctx.response.end('Unauthorized');
return;
}
ctx.state.user = await validateToken(token);
await next();
});
});
}
};
```
```html
<!DOCTYPE html>
<html>
<head>
<title>{{title}}</title>
</head>
<body>
<header>
<h1>My App</h1>
</header>
<main>
{{body}}
</main>
<footer>
© 2025
</footer>
</body>
</html>
```
```html
<h2>{{title}}</h2>
<ul>
{{
<li>{{this.name}}</li>
{{/each}}
</ul>
```
```bash
master=development node server.js
NODE_ENV=production node server.js
```
No more hardcoded request flow! Add custom middleware:
```javascript
// In config/initializers/config.js
master.pipeline.use(async (ctx, next) => {
// Before request
await next();
// After response
});
master.pipeline.map('/admin/*', (admin) => {
admin.use(authMiddleware);
});
```
Route parameters now preserve casing:
```javascript
router.route("/period/:periodId", "period#show", "get");
// In controller:
show(obj) {
const periodId = obj.params.periodId; // ✅ Not periodid!
}
```
Middleware in `middleware/` folder is auto-loaded alphabetically:
```
middleware/
├── 01-logger.js
├── 02-api-auth.js
└── 03-admin-auth.js
```
No more `addInternalTools()` - everything is auto-loaded!
**Before:**
```javascript
master.addInternalTools(["MasterError", "MasterRouter", ...]);
```
**After:**
```javascript
var server = master.setupServer("http"); // Tools auto-loaded!
```
```javascript
master.cors.init({
origin: true,
credentials: true,
methods: ['GET', 'POST', 'PUT', 'DELETE']
});
```
```javascript
master.sessions.init({
secret: 'your-secret-key',
maxAge: 900000,
httpOnly: true,
secure: true
});
// In controller:
master.sessions.set('user', userData, obj.response);
const user = master.sessions.get('user', obj.request);
```
```javascript
const { pipelineSecurityHeaders, pipelineRateLimit } =
require('mastercontroller/security/SecurityMiddleware');
master.pipeline.use(pipelineSecurityHeaders());
master.pipeline.use(pipelineRateLimit({ rateLimitMax: 100 }));
```
```javascript
// Singleton (one instance for app)
master.addSingleton('db', DatabaseConnection);
// Scoped (one instance per request)
master.addScoped('logger', RequestLogger);
// Transient (new instance per access)
master.addTransient('email', EmailService);
// Use in controllers:
class UsersController {
index(obj) {
const users = this.db.query('SELECT * FROM users');
this.logger.log('Fetched users');
this.email.send(user.email, 'Subject', 'Body');
}
}
```
Self-contained modules:
```javascript
// In config/initializers/config.js
master.component('components', 'auth');
master.component('components', 'mail');
```
Components have their own routes, controllers, views, and services.
1. **Read the README.md** - Complete API documentation
2. **Check middleware/README.md** - Middleware patterns and examples
3. **Explore examples** - See `.example` files in middleware/
4. **Add security** - Enable rate limiting, CSRF, security headers
5. **Add DI services** - Register your database, logger, email service
```bash
master generate controller Users
master generate component auth
master=development node server.js
NODE_ENV=production node server.js
```
- **Documentation:** [README.md](README.md)
- **Middleware Guide:** [middleware/README.md](middleware/README.md)
- **GitHub:** https://github.com/alexanderrich/mastercontroller
- **Issues:** https://github.com/alexanderrich/mastercontroller/issues
---
**Welcome to MasterController!** 🚀