Home

Awesome

frex.js Web Framework

A framework for creating modern web applications, it's easy-use for front-end developer and JavaScript people. frex.js is NOT a traditional MVC web framework. It aims to provide a new way to develop web service without server-side knowledge, do everthing in JavaScript.

With integration of front-end/back-end web development experiences, it uses pure JavaScript method instead of tranditional web communication methods. There is no need to understand GET/POST methods of HTTP protocol and implement AJAX stuffs directly, developer totally can write a web service with front-end web development experence only.

frex.js is based on Express web framework in Node.js, it means developer who is already familiar with node.js development, no need to learn new things for using frex.js, and furthermore, it can support all express middleware. Even if you do not prefer to use special feature of frex.js, you can still do your job under old school MVC model.

Features

Installation

Install directly via NPM

npm install frex.js

Getting started

frex.js is based on Express web framework, you can just write your web app with traditional way.

<project directory>/app.js:

var Frex = require('frex.js');

var app = Frex();

app.get('/', function(req, res){
        res.send('Hello World');
});

app.listen(8080);

Managing Routes with frex.js

frex.js is using "routes" directory for putting route rules by default, it supports all features of courser.

<project directory>/routes/index.js:

module.exports = {
        '/': function(req, res) {
                res.render('index');
        }
};

New Way to Make Your Service APIs with Engine

Engine is the fast way to implement your own service APIs, using JavaScript RPC for communicating between client and server. Futhermore, having pure javascript experience is enough for it without understanding HTTP methods, AJAX and polling things.

You should put all engine files in the "engine" directory.

<project directory>/engine/myengine.js:

var MyEngine = function() {
    this.message = 'Hello world';
};

MyEngine.prototype.sum = function(a, b, callback) {
    callback(a + b);
};

module.exports = {
        type: 'engine',
        engine_name: 'MyEngine',
        prototype: MyEngine
};

The Engine will be running on server-side, but frex.js make you able to invoke methods of "MyEngine" and get/set properties of backend engine instance on client-side.

<script type="text/javascript" src="/frex"></script>
<script>

    // Pass your params if you need.
    App.setConnectionParams({
        "_csrf": "here is your CSRF token."
    });

    App.require('MyEngine', function() {
        var myEngine = App.Engine('MyEngine');

        // Get value to variable of backend engine
        console.log(myEngine.message);

        // Call function of backend engine
        myEngine.sum(1, 3, function(result) {
            console.log(result);
        });

        // Set value to variable of backend engine
        myEngine.message = 'Hello Engine';
    });
    
</script>

Calling APIs of Engine on the Server-side

Calling APIs of Engine on client-side is not only way to use engine, you can call it on the server-side as well.

Here is example to render web page on the server-side with calling APIs of engine:

module.exports = {
    '/': function(req, res) {
        var myEngine = req.frex.Engine('MyEngine');
        myEngine.sum(1, 3, function(result) {

            res.render('index', { result: result });
        });
    }
};

Protect the APIs of Engine with Session

In fact, we hope some of APIs are not available to be accessed by anybody, permission check is needed.

Here is example to make access control for engine with Session:

module.exports = {
        type: 'engine',
        engine_name: 'MyEngine',
        prototype: MyEngine,
        check_permission: function(callback) {

			var conn = this.frex.getConnection(arguments);

            if (!conn.req.session.login)
                callback(false);
            else
                callback(true);
        }
};

Using Event Emitter to Hook Engine for Realtime Purpose

It's possible to hook class of engine with event emitter. With event emitter support, you can make real-time service easily.

Server-side

var util = require('util');
var events = require('events');

var MyEngine = function() {
    var self = this;
    self.count = 0;

    // Fire event per second
    setTimeout(function() {
        self.count++;
        self.emit('pump', self.count);
    }, 1000);
};

util.inherits(MyEngine, events.EventEmitter);

Client-side

myEngine.on('pump', function(count) {
    console.log(count);
});

Using CSRF middleware with Engine

Pass your own params ( like CSRF token ) to the Engine. Using setConnectionParams method before you require your Engine.

Client-side

App.setConnectionParams({
    "_csrf": '/* your CSRF token here. */'
});

App.require('MyEngine', function() {
    /* code here */
});

APIs

frex.js provides useful server-side APIs for engine and backend development:


<a name="engine" /> ### Engine(engine_name)

Get specific engine.

Arguments


<a name="error" /> ### Error(error_object)

Convert Error object of Node.js to JSON for transfering to client.

Error object of Node.js cannot be sent to client directly, object received by client is empty. This API can solve this problem.

Arguments

Example


var MyEngine = function() {
    this.message = 'Hello world';
};

MyEngine.prototype.getError = function(callback) {

    var err = new Error('Something\'s wrong');
    
    callback(MyEngine.frex.Error(err));
};

module.exports = {
        type: 'engine',
        engine_name: 'MyEngine',
        prototype: MyEngine
};

<a name="get_connection" /> ### getConnection(arguments)

Get connection which includes request and response from express.

The implementation in engine can get current connection for session and some works else via this API.

Arguments

Example


var MyEngine = function() {
    this.message = 'Hello world';
};

MyEngine.prototype.login = function(username, password, callback) {

    if (username == 'user' && password == 'pass') {

        // Get connection
        var conn = MyEngine.frex.getConnection(Arguments);

        // Access session of request from connection
        conn.req.session.logined = true;
        return;
    }

    callback(false);
};

module.exports = {
        type: 'engine',
        engine_name: 'MyEngine',
        prototype: MyEngine
};

<a name="get_request" /> ### getRequest(arguments)

Get request from connection.

Arguments


<a name="get_response" /> ### getResponse(arguments)

Get response from connection.

Arguments

License

Licensed under the MIT License

Authors

Copyright(c) 2013 Fred Chien <cfsghost@gmail.com>