hellotest1024 / express-study

0 stars 0 forks source link

express源码学习 #1

Open hellotest1024 opened 5 years ago

hellotest1024 commented 5 years ago

一、入口 express服务demo: (1) express原生

var express = require('express');
var app = express();

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

app.listen(3000, function() {
  console.log('App listening on port 3000!');
});

(2)express-generetor生成项目

app.js
var express = require('express');
var app = express();

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

bin目录
var app = require('./app');
var http = require('http');

var server = http.createServer(app);

server.listen(3000);

express的index.js 中module.exports = require('./lib/express'); 导出express 而express.js中 exports = module.exports = createApplication; 导出的即createApplication函数

function createApplication() {
  var app = function(req, res, next) {
    app.handle(req, res, next);
  };

  mixin(app, EventEmitter.prototype, false);
  mixin(app, proto, false);   //app集成proto(./application)的属性

  // expose the prototype that will get set on requests
  app.request = Object.create(req, {
    app: { configurable: true, enumerable: true, writable: true, value: app }
  })

  // expose the prototype that will get set on responses
  app.response = Object.create(res, {
    app: { configurable: true, enumerable: true, writable: true, value: app }
  })

  app.init();
  return app;
}

所以var express = require('express'); express就是 createApplication()函数 var app = express(); app 就是createApplication()返回的app函数

demo1中app.listen() 调用

app.listen = function listen() {
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};

这和demo2中 var server = http.createServer(app);的效果是一样的。 都是将 var app = function(req, res, next) { app.handle(req, res, next); };作为回调函数,传入node提供的http模块中,从而启动服务。

总结:express应用就是将function(req, res, next) { app.handle(req, res, next);} 函数作为http.createServer()的回调函数,从而调用handle(req, res, next)处理请求。

hellotest1024 commented 5 years ago

二、中间件的注册