ExpressJS for NodeJS 开发(草稿)

ExpressJS for NodeJS 开发(草稿)
// 开始编写,所以比较凌乱,随笔写法,之后会逐步整理

作者:LEO.Zeng   EMAIL: lelandtseng@gmail.com QQ:308212012

前言

ExpressJS是一个Web开发框架,基于NodeJS。我们没有必要对历史产生兴趣,我相信直入主题是你最喜欢的。
我们用ExpressJS就是要开发优秀的Web应用程序,而我们用的语言就是Javascript,而NodeJS就是运行
Javascript的容器环境。我们知道Javascript的宿主有浏览器,这一下又多了一个NodeJS,也就是我们可以
用JavaScript编写服务器端的程序了。

以上就简介这些,我想说的太多没有什么好处。前提你要熟悉Javascript语言。

安装NodeJS  参考 http://nodejs.org
安装ExpressJS  参考 http://github.com/visionmedia/express

安装好NodeJS之后可以在终端运行 node -v 测试结果应该是nodeJS的版本号,同理ExpressJS也可以用
express -v 查看其版本号。

下面以express例子作为基础,开始讲解Express用法,
源代码 http://github.com/visionmedia/express/tree/master/examples/mvc/

我们通过 node app.js 就可以启动这个 mvc 程序
我们先来看一下 app.js源代码:
    
    //这一句是导入express库,require类似我们浏览器<script src...>的用法
    var express = require('../../lib/express');
    
    //通过express创建一个Express应用app.
    var app = express.createServer();
    
    //导入mvc库,并调用boot启动方法
    require('./mvc').boot(app);

    //启动服务器监听 request
    app.listen();
    
    //在控制台打印描述
    console.log('Application server started on port 3000');

我们再来看一下 mvc.js的源代码
    
    //fs是文件读写的库是nodejs的重要API
    var fs = require('fs'),
        express = require('../../lib/express');

    ***************************************************
    exports英文是出口的意思,这是属于nodejs的一个核心属性。
    app.js中能够这么写 require('./mvc').boot(app); 也是由于它。
    这里不做太多叙述,因为会更迷糊,看看上面的引用例子就明白拉。
    ***************************************************
    exports.boot = function(app){
        bootApplication(app);
        bootControllers(app);
    };

    // 启动APP
    function bootApplication(app) {
    
        ***************************************************
        app.use() 方法可以说是express核心。
        我们知道web应用的原理,简化来说,就是 req -> app -> res 的过程。
        而nodejs也是提供req和res的,但是都很原始,比如没有cookie/session
        等功能。
        通过app.use()就可以对req和res进行扩展
        比如 app.use(express.session()); 我们就扩展了 req,使得它
        具有 req.session 的属性。
        ***************************************************
        app.use(express.logger({ format: ':method :url :status' }));
        app.use(express.bodyDecoder());
        app.use(express.methodOverride());
        app.use(express.cookieDecoder());
        app.use(express.session());
        app.use(app.router);
        app.use(express.staticProvider(__dirname + '/public'));

        // 表示当路由是 “/” 时候返回404.html页
        app.use(function(req, res){
            res.render('404');
        });

        // 设置views页面主目录
        app.set('views', __dirname + '/views');
        
        // 设置动态页面的引擎采用ejs,并且扩展名为.html时,会自动用EJS引擎解析。
        app.register('.html', require('ejs'));       
        app.set('view engine', 'html');

        // 这是动态帮助,这里面可以定义views/里面的ejs页面访问的方法。
        app.dynamicHelpers({
            request: function(req){  //定义的方法
                return req;
            },

            hasMessages: function(req){
                return Object.keys(req.session.flash || {}).length;
            },

            messages: function(req){
                return function(){
                    var msgs = req.flash();
                    return Object.keys(msgs).reduce(function(arr, type){
                        return arr.concat(msgs[type]);
                    }, []);
                }
            }
        });
    }

    // 启动控制器

    function bootControllers(app) {
        fs.readdir(__dirname + '/controllers', function(err, files){
            if (err) throw err;
            files.forEach(function(file){
                bootController(app, file);
            });
        });
    }

    function bootController(app, file) {
        var name = file.replace('.js', ''),
            actions = require('./controllers/' + name),
            plural = name + 's', // realistically we would use an inflection lib
            prefix = '/' + plural;

        // Special case for "app"
        if (name == 'app') {
            prefix = '/';
        }

        Object.keys(actions).map(function(action){
            var fn = controllerAction(name, plural, action, actions[action]);
            switch(action) {
                case 'index':
                    app.get(prefix, fn);
                    break;
                case 'show':
                    app.get(prefix + '/:id', fn);
                    break;
                case 'add':
                    app.get(prefix + '/:id/add', fn);
                    break;
                case 'create':
                    app.post(prefix + '/:id', fn);
                    break;
                case 'edit':
                    app.get(prefix + '/:id/edit', fn);
                    break;
                case 'update':
                    app.put(prefix + '/:id', fn);
                    break;
                case 'destroy':
                    app.del(prefix + '/:id', fn);
                    break;
            }
        });
    }

    

    function controllerAction(name, plural, action, fn) {
        return function(req, res, next){
            var render = res.render,
                path = __dirname + '/views/' + name + '/' + action + '.html';
            res.render = function(obj, options, fn){
                res.render = render;
                options = options || {};
                options.locals = options.locals || {};
                // Expose obj as the "users" or "user" local
                if (action == 'index') {
                    options.locals[plural] = obj;
                } else {
                    options.locals[name] = obj;
                }
                return res.render(path, options, fn);
            };
            fn.apply(this, arguments);
        };
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值