Node.js Connect createServer代码

5q4ezhmt  于 2023-05-28  发布在  Node.js
关注(0)|答案(1)|浏览(140)

我正在阅读Node.js Connect 2.15.0版本:

/**
 * Create a new connect server.
 *
 * @return {Function}
 * @api public
 */

function createServer() {
  function app(req, res, next){ app.handle(req, res, next); }
  utils.merge(app, proto);
  utils.merge(app, EventEmitter.prototype);
  app.route = '/';
  app.stack = []; 
  for (var i = 0; i < arguments.length; ++i) {
    app.use(arguments[i]);
  }
  return app;
};

几个问题:

  1. app.handle似乎在proto中提供,因为在proto.js中定义了app.handle。所以,这是一个闭包的使用,app.handle不是在Node解析function app()的时候定义的,而是在代码的后面定义的?app本身也定义在... uh.中。function app() .代码对我来说似乎很有趣。
    1.什么时候调用function app()?我只知道创建服务器会创建服务器。那么我什么时候调用这个函数呢?我做了一些像:
app = createServer()
app.listen(3000)
app(req, res, next)
  1. utils.merge()简单地说
exports.merge = function(a, b){ 
  if (a && b) {
    for (var key in b) {
      a[key] = b[key];
    }   
  }
  return a;
};

这是一个常见的做法,而不是继承或什么?我看是mixin

scyqe7ek

scyqe7ek1#

  1. app.handle似乎在proto中提供,因为在proto.js中定义了app.handle。所以,这是一个闭包的使用,app.handle不是在Node解析function app()的时候定义的,而是在代码的后面定义的?app本身也定义在... uh.中。function app() .代码对我来说似乎很有趣。
    app.handle来自proto。但是不,在app函数中访问app不是闭包,函数在所有函数声明中都可以通过其名称获得。
    2.什么时候调用function app()?我只知道createServer创建了服务器。那么我什么时候调用这个函数呢?
    connect docs使用以下示例代码:
var app = connect();
…
http.createServer(app).listen(3000);

您可以看到connect(您发布的createServer函数)确实创建了app,它作为处理程序传递给实际的http服务器。
3. utils.merge()是代替继承的常见做法吗?我看是mixin
是的,merge确实将一个对象混入另一个对象。这样做是为了用所有必要的方法扩展函数对象app。这是必要的,因为不可能以标准的方式Define a function with a prototype chain。他们可能也使用了类似的方法:

app.__proto__ = utils.merge(Object.create(EventEmitter.prototype), proto);

app就不再是instanceof Function了并且没有函数方法。

相关问题