zoukankan      html  css  js  c++  java
  • express源码学习

    终于腾出手来学习express。express在node.js中一株独秀。好像任何一种有主导的托管平台的语言,都出现这现象——马太效应。express是社区的共同孩子,里面聚集上社区最好的常用模块。从源码来看,它分为八大块,application.js, express.js, middleware.js, request.js, response.js, utils.js, view.js与router。

    express.js相当于过程式语言的main函数,是一个入口,吐出express这个工厂函数。

    从代码组织来看,我们会发现一个有趣的现象。引入语句总是位于上方,主程序夹在中间,主程序用到的一些辅助函数放在后面。在node.js,我们会频繁看到ES5的一些新方法,这也node.js的特色之一。

    var connect = require('connect')
      , proto = require('./application')
      , Route = require('./router/route')
      , Router = require('./router')
      , req = require('./request')
      , res = require('./response')
      , utils = connect.utils;
    
    /**
     * Expose `createApplication()`.
     */
    
    exports = module.exports = createApplication;
    
    /**
     * Expose mime.
     */
    
    exports.mime = connect.mime;
    
    /**
     * Create an express application.
     *
     * @return {Function}
     * @api public
     */
    
    function createApplication() {
      var app = connect();
      utils.merge(app, proto);
      app.request = { __proto__: req, app: app };
      app.response = { __proto__: res, app: app };
      app.init();
      return app;
    }
    
    /**
     * Expose connect.middleware as express.*
     * for example `express.logger` etc.
     */
    
    for (var key in connect.middleware) {
      Object.defineProperty(
          exports
        , key
        , Object.getOwnPropertyDescriptor(connect.middleware, key));
    }
    
    /**
     * Error on createServer().
     */
    
    exports.createServer = function(){
      console.warn('Warning: express.createServer() is deprecated, express');
      console.warn('applications no longer inherit from http.Server,');
      console.warn('please use:');
      console.warn('');
      console.warn('  var express = require("express");');
      console.warn('  var app = express();');
      console.warn('');
      return createApplication();
    };
    
    /**
     * Expose the prototypes.
     */
    
    exports.application = proto;
    exports.request = req;
    exports.response = res;
    
    /**
     * Expose constructors.
     */
    
    exports.Route = Route;
    exports.Router = Router;
    
    // Error handler title
    
    exports.errorHandler.title = 'Express';
    

    这个JS文件会返回一个函数,叫做express,其实就是这句exports = module.exports = createApplication;

    另一个难点是__proto_的应用, 我们知道prototype是应用于构造函数,而__proto_则是应用于它的实例,简单来说它相当于 obj.constructor.prototype。

    
    app.response = { __proto__: res, app: app };
    

    我们可以想象response这个对象被赋以了一个原型,叫做res,它的特权方法与属性放到app中。 req 与res都是内置对象的一个实例的加强版。

  • 相关阅读:
    基于spark实现表的join操作
    关于IO的一些数字
    scala的REPL shell的调用
    搭建eclipse+maven+scala-ide的scala web开发环境
    Apache Mesos总体架构
    spark下测试akka的分布式通讯功能
    akka创建actor时报错:IllegalArgumentException: no matching constructor found on class $iwC$$iwC$$iwC$$iwC$
    akka构建简单分布式应用
    Memcached 工作原理
    分析Redis架构设计
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/3381678.html
Copyright © 2011-2022 走看看