Функция hook res.render () в express.js [duplicate]

Ответ аномии хорош, но я чувствовал себя неуверенно в этом, поэтому решил добавить пару скриншотов.

Шаг 0: git log

Посмотрите, где вы находитесь git log. Самое главное, найдите хеш фиксации первой фиксации, которую вы не хотите , чтобы сквош. Таким образом, только:

Шаг 1: git rebase

Выполнить git rebase -i [your hash] , в мой случай:

$ git rebase -i 2d23ea524936e612fae1ac63c95b705db44d937d

Шаг 2: выберите / сквош, что вы хотите

В моем случае я хочу раздавить все на коммит, который был первым во времени. Порядок от первого до последнего, так точно так же, как в git log. В моем случае я хочу:

Шаг 3: Отрегулировать сообщения (ы)

Если вы выбрали только одно коммит и раздавили остальное, вы можете настроить одно сообщение фиксации:

Вот и все. Как только вы сохраните это (:wq), все готово. Посмотрите на это с помощью git log.

21
задан Sunday Ironfoot 17 February 2012 в 11:09
поделиться

4 ответа

Старый вопрос, но обнаружил, что я спрашиваю одно и то же. Как перехватить res render? Теперь с помощью express 4.0x.

Вы можете использовать / писать промежуточное программное обеспечение. Поначалу концепция была немного сложной, но после некоторого чтения это немного пошло. И только для некоторого контекста для тех, кто читает это, мотивация переопределения res.render заключалась в предоставлении глобальных переменных представления. Я хочу, чтобы session был доступен во всех моих шаблонах, без необходимости вводить его в каждый res-объект.

Основной формат промежуточного программного обеспечения.

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

Следующий вызов функции и функции имеет решающее значение для выполнения. next - это функция обратного вызова, позволяющая нескольким промежуточным программам делать свою работу без блокировки. Для лучшего объяснения , прочитанного здесь

Это можно затем использовать для переопределения схемы визуализации

app.use( function( req, res, next ) {
    // grab reference of render
    var _render = res.render;
    // override logic
    res.render = function( view, options, fn ) {
        // do some custom logic
        _.extend( options, {session: true} );
        // continue with original render
        _render.call( this, view, options, fn );
    }
    next();
} );

. Я протестировал этот код с помощью express 3.0. 6. Он должен работать с 4.x без проблем. Вы также можете переопределить определенные URL-адреса комбо с

app.use( '/myspcificurl', function( req, res, next ) {...} );
22
ответ дан Lex 23 August 2018 в 17:31
поделиться

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

Как вы знаете, javascript - это язык, основанный на Prototype, и каждый объект имеет прототип, например, объекты ответа и запроса. Просмотрев код (выражение 4.13.4), вы можете найти их прототипы:

req => express.request
res => express.response

Поэтому, когда вы хотите переопределить метод для каждого отдельного экземпляра ответа, гораздо лучше переопределить его в его прототип, как это делается один раз, доступен в каждом экземпляре ответа:

var app = (global.express = require('express'))();
var render = express.response.render;
express.response.render = function(view, options, callback) {
    // desired code
    /** here this refer to the current res instance and you can even access req for this res: **/
    console.log(this.req);
    render.apply(this, arguments);
};
6
ответ дан Ali 23 August 2018 в 17:31
поделиться

Объект response не имеет прототипа. Это должно сработать (принимая идею Райана поместить его в промежуточное ПО):

var wrapRender = function(req, res, next) {
  var _render = res.render;
  res.render = function(view, options, callback) {
    _render.call(res, "testViews/" + view, options, callback);
  };
};

Однако лучше взломать ServerResponse.prototype:

var express = require("express")
  , http = require("http")
  , response = http.ServerResponse.prototype
  , _render = response.render;

response.render = function(view, options, callback) {
  _render.call(this, "testViews/" + view, options, callback);
};
7
ответ дан Linus Gustav Larsson Thiel 23 August 2018 в 17:31
поделиться

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

Здесь есть множество отличных решений.

Я решил пойти с чем-то очень близким к решению, предложенным Лексом, но столкнулся с проблемами, когда вызовы res.render () уже не включали существующие параметры. Например, следующий код вызывал исключение в вызове extend (), поскольку параметры были неопределенными:

return res.render('admin/refreshes');

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

app.use(function(req, res, next) {
  var _render = res.render;
  res.render = function(view, options, callback) {
    if (typeof options === 'function') {
      callback = options;
      options = {};
    } else if (!options) {
      options = {};
    }
    extend(options, {
      gaPropertyID: config.googleAnalytics.propertyID,
      gaCookieDomain: config.googleAnalytics.cookieDomain
    });
    _render.call(this, view, options, callback);
  }
  next();
});

edit: Оказывается, что, хотя это все может быть удобно, когда мне нужно фактически запустить какой-то код, есть чрезвычайно простой способ выполнить что я пытался сделать. Я снова посмотрел на источник и документы для Express, и выясняется, что app.locals используются для визуализации каждого шаблона. Поэтому в моем случае я в конечном итоге заменил весь код промежуточного программного обеспечения выше со следующими назначениями:

app.locals.gaPropertyID = config.googleAnalytics.propertyID;
app.locals.gaCookieDomain = config.googleAnalytics.cookieDomain;
3
ответ дан Timothy Johns 23 August 2018 в 17:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: