понимание express-кода

Я проверяю код express.js и пытаюсь переписать его, чтобы узнать, как создавать middlewares (framework). Но все наследование вокруг кода меня сбивает с толку.

Соответствующие коды:

  • express.js
  • application.js
  • request.js
  • response.js

На express.js этот код:

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

__proto__ – устаревший. @Bergi сказал мне, что я могу заменить такой код:

 app.request = Object.create(req); app.request.app = app; app.response = Object.create(res); app.response.app = app; 

Но теперь странно, что приложение.js снова имеет похожий код – я думаю .

 // inherit protos this.on('mount', function(parent){ this.request.__proto__ = parent.request; this.response.__proto__ = parent.response; this.engines.__proto__ = parent.engines; this.settings.__proto__ = parent.settings; }); 

Который испускается здесь:

 mount_app.mountpath = mount_path; mount_app.parent = this; // restore .app property on req and res router.use(mount_path, function mounted_app(req, res, next) { var orig = req.app; mount_app.handle(req, res, function(err) { req.__proto__ = orig.request; res.__proto__ = orig.response; next(err); }); }); // mounted an app mount_app.emit('mount', this); 

И тогда даже request.js и response.js имеют наследование, кажется понятным, хотя я не совсем понимаю, как они это делают.

 //is this exporting http.IncomingMessage.prototype??? var req = exports = module.exports = { __proto__: http.IncomingMessage.prototype }; 

Я не очень хорошо javascript . Я хотел бы найти книги для чтения по теме наследования.

Мои вопросы:

  • В чем смысл всего этого наследования.
  • Разве не 1-й и 2-й случаи я указал на избыточность?
  • И как мне переписать, избегая устаревших __proto__ ?

Фон

На самом деле я просто пытаюсь написать простую систему на основе промежуточного программного обеспечения. Что-то я могу сделать:

 // route app.use('/', function(req,res) { }); 

Просто так просто, но я также хочу добавить больше методов для req и res . Вот почему я смотрю, как это реализовано. Хотя connect не добавил дополнительных методов для req и res . Вот почему я пытаюсь понять express .

Ужасный способ добавления методов res или req :

 // middleware app.use(function(req, res) { req.mymethod = function()... }); 

Теперь у следующего промежуточного ПО есть дополнительный метод req но я считаю это грязным. Вот почему я пытаюсь понять expressjs и как они реализовали это наследование.

Примечание. Я успешно написал рабочую простую промежуточную систему, но до сих пор не знаю, как добавить методы для req / res. Я также рассматриваю обертывание объектов (возможно, это то, что они сделали с req и res?)

В этом отношении нет ничего неправильного:

 app.use(function(req, res) { req.mymethod = function()... }); 

Средство промежуточного уровня работает в том порядке, в котором оно определено, поэтому пока оно появляется перед вашим другим промежуточным программным обеспечением и маршрутами, у вас есть уверенность, что он будет там.

Лично, если бы это была статическая функция, которая не делала ничего интересного, я бы сохранил ее в отдельном модуле, require() там, где она мне нужна, и оставьте ее на этом. Но если по какой-то причине вам нужны переменные, зависящие от запроса, может быть удобно сделать это, как вы предложили. Например, создавая закрытие:

 app.use(function(req, res, next) { // Keep a reference to `someVar` in a closure req.makeMessage = (function(someVar) { return function () { res.json({hello : someVar}); }; })(/* put the var here */); next(); }); app.get('/hello', function(req, res) { req.makeMessage(); }); 

Надуманный, довольно бесполезный пример, но он может быть полезен в некоторых случаях.