1 一个简单的http服务如下:

  1. var http = require('http')
  2. http.createServer(function(req,res){
  3. res.writeHead(200, {'content-type':'text/plain'})
  4. res.end('hello world')
  5. }).listen(3000, '127.0.0.1')
  6. console.log('server running at http://127.0.0.1:3000/')

but
实际应用中,业务还需要做
请求方法、url解析、查询参数解析、cookie解析、表单解析、图片上传等等处理
but
不管这些业务处理有多复杂,只要最终结果返回如下一个函数作为参数,传递给createServer()方法作为request事件的侦听器就可以了。

  1. functionreqres){
  2. // res.end()
  3. }

2 如 koa框架-http服务

  1. const Koa = require('koa');
  2. const app = new Koa();
  3. app.use(async ctx => {
  4. ctx.body = 'Hello World';
  5. });
  6. app.listen(3000); // 等同于 http.createServer(app.callback()).listen(3000);

分析

  1. //Koa构造函数
  2. //application.js
  3. const response = require('./response');
  4. const compose = require('koa-compose');
  5. const context = require('./context');
  6. const request = require('./request');
  7. const Emitter = require('events');
  8. module.exports = class Application extends Emitter { // 继承events模块,可以订阅-发布功能
  9. constructor(options) {
  10. super();
  11. options = options || {};
  12. this.env = options.env || process.env.NODE_ENV || 'development';
  13. this.middleware = []; // 存储中间件函数的数组
  14. this.context = Object.create(context); // 应用的上下文属性 都继承自对应的原型对象
  15. this.request = Object.create(request); // 应用的请求属性
  16. this.response = Object.create(response); // 应用的响应属性
  17. }
  18. // http.createServer封装
  19. listen(...args) {
  20. debug('listen');
  21. const server = http.createServer(this.callback()); // this.callback()返回一个函数传递给createServer
  22. return server.listen(...args);
  23. }
  24. // Return a request handler callback for node's native http server.
  25. callback() {
  26. const fn = compose(this.middleware);
  27. // 订阅错误事件,继承于events模块
  28. if (!this.listenerCount('error')) this.on('error', this.onerror);
  29. // function(req,res) 传递给createServer的request事件侦听器
  30. const handleRequest = (req, res) => {
  31. const ctx = this.createContext(req, res);
  32. return this.handleRequest(ctx, fn);
  33. };
  34. return handleRequest;
  35. }
  36. // 存储中间件函数
  37. use(fn) {
  38. if (typeof fn !== 'function') throw new TypeError('middleware must be a function!');
  39. debug('use %s', fn._name || fn.name || '-');
  40. this.middleware.push(fn);
  41. return this;
  42. }
  43. }