Подтвердить что ты не робот

В Express и Node.js можно ли расширить или переопределить методы объекта ответа?

С каждым промежуточным программным обеспечением Express передает объекты res и req. Эти объекты расширяют собственные, которые поступают из http.ServerResponse и http.ClientRequest соответственно. Я хотел бы знать, возможно ли переопределить или расширить методы объекта ответа.

Например, вместо res.render('home', jsonData);, я хотел бы расширить res с помощью специального метода под названием customRender и использовать его так: res.customRender().

Я не зацикливаюсь на какой-то конкретной проблеме или что-то еще. Я просто хотел бы узнать, как расширить собственные объекты или, как в этом случае, объект, который поступает из сторонних модулей в Node.js

4b9b3361

Ответ 1

Лучшей идеей было бы добавить пользовательский метод к прототипу объекта ответа:

var express = require("express");

express.response.customRender = function() {
    // your stuff goes here
};

И эта функция должна быть доступна каждому объекту res.

Вы можете прочитать исходный код, чтобы узнать, как они расширяют собственные объекты. В основном они выполняют цепочку прототипов:

выразить /Library/response.js

var res = module.exports = {
  __proto__: http.ServerResponse.prototype
};

И этот объект становится прототипом нового созданного объекта ответа (который исходит из рамки соединения):

res.__proto__ = app.response;

(app.response - это просто псевдоним res, определенный выше). Обратите внимание, что свойство __proto__ является ссылкой на прототип объекта.

Будьте осторожны. Прежде всего __proto__ не является частью EcmaScript (он может быть недоступен в других реализациях JavaScript). Во-вторых: обычно вы наследовали бы с помощью Object.create (установка __proto__ непосредственно на объект - это патч обезьяны, и это, как правило, плохая практика, это может нарушить многие вещи). Подробнее об этом читайте здесь:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain

Ответ 2

Просто добавьте промежуточное программное обеспечение, которое добавит функцию customRender к res.

function(req, res, next) {
  res.customRender = function() {
    // implement your custom renderer
  }
  next();
}