express-junction
express-junction is Express-compatible middleware for Node.js.
This middleware provides following features.
- URL routing like ASP.NET MVC.
- Authentication
- Authorization
"express-junction" provides defaultly /{controller name}/{action name}
URL routing rule.
there is development restriction (controllers path, and views path) , but, this middleware enables you to above URL routing more easier.
Details of path rules are following:
- Controller scripts make under the directory of "/controllers".
- View templates make under the directory of "/views/{controller name}".
If follow above path rules, then you can access /{controller name}/{action name}
URL.
Installation
$ npm install express-junction --save
Dependencies
Sample Code
- /app.js
- /controllers/home.js
- /controllers/account.js
- /views/home/index.ejs
- /views/account/login.ejs
- /views/account/profile.ejs
/app.js
var express = require("express");var session = require("express-session");var bodyParser = require("body-parser");var junction = require("express-junction"); /** * On save to session. */junction.set("serialize", function (data, done) { done(null, data);}); /** * On load from session. */junction.set("deserialize", function (data, done) { // User.findById(id, function (error, user){ // done(error, user); // }); var user = { name: data, roles: ["test"] }; done(null, user);}); /** * On authorize access. */junction.set("authorize", function (request, done) { var user = request.user || {}; var username = user.name; var roles = user.roles; done(null, username, roles);}); // express applicationvar app = express(); // initial settingsapp.set("views", "./views");app.set("view engine", "ejs");app.disable("x-powered-by"); // midle ware settingsapp.use(session({ secret: "some salt", resave: false, saveUninitialized: true, name: "sid"}));app.use(bodyParser.urlencoded({ extended: true }));app.use(bodyParser.json());app.use(junction());app.use("/public", express.static("public")); // set routing.app.use("/", junction.router()); // start web applicaiton.app.listen();
/controllers/home.js
var {Controller, Action, allow, deny} = require("express-junction"); // Create Home controller.var controller = new Controller("home"); // GET:/home/index action.controller.add(new Action( "GET", "index", function (request, response) { return this.view({ title: "/home/index" }); })); module.exports = controller;
/controllers/account.js
var {Controller, Action, allow, deny} = require("express-junction"); // Create Account controller.var controller = new Controller("account"); // GET: /account/logincontroller.add(new Action( "GET", "login", function (request, response) { return this.view({ title: "/account/login", message: "" }); })); // POST: /account/logincontroller.add(new Action( "POST", "login", function (request, response) { var username = request.body.username; var password = request.body.password; if (!username || !password || username !== password) { return this.view({ message: "Invalid username or password." }); } request.signin(username, true, (error) => { if (error) { throw error; } return this.redirect("/account/profile"); }); })); // POST: /account/logoutcontroller.add(new Action( "POST", "logout", function (request, response) { request.signout((error) => { if (error) { throw error; } return this.json({ status: 200, message: "OK" }); }); })); // GET: /accout/profilecontroller.add(new Action( "GET", "profile", [allow({ users: "?" })], function (request, response) { return this.view({ title: "/account/pforile", user: (request.user || { name: "" }) }); })); module.exports = controller;
/views/home/index.ejs
<%= title %> Toggle navigation Project name Home About Contact <!--/.nav-collapse --> Authenticate / Authorize Sample Project This sample use Node.js, Express, Passport, MongoDB. You can learn how to build authn/authz function. Sign-in <!-- /.container -->
/views/account/login.ejs
<%= title %> Toggle navigation Project name Home About Contact <!--/.nav-collapse --> Login User Name Password <% if (message) {%> ERROR: <%= message %> <%}%> <!-- /.container -->
/views/account/profile.ejs
<%= title %> Toggle navigation Project name Home About Contact <!--/.nav-collapse --> profile page <% for (var key in user) { %> <%= key %> <%= user[key] %> <% }%> <!-- /.container -->