Ответ аномии хорош, но я чувствовал себя неуверенно в этом, поэтому решил добавить пару скриншотов.
Посмотрите, где вы находитесь git log
. Самое главное, найдите хеш фиксации первой фиксации, которую вы не хотите , чтобы сквош. Таким образом, только:
Выполнить git rebase -i [your hash]
, в мой случай:
$ git rebase -i 2d23ea524936e612fae1ac63c95b705db44d937d
В моем случае я хочу раздавить все на коммит, который был первым во времени. Порядок от первого до последнего, так точно так же, как в git log
. В моем случае я хочу:
Если вы выбрали только одно коммит и раздавили остальное, вы можете настроить одно сообщение фиксации:
Вот и все. Как только вы сохраните это (:wq
), все готово. Посмотрите на это с помощью git log
.
Старый вопрос, но обнаружил, что я спрашиваю одно и то же. Как перехватить 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 ) {...} );
Не рекомендуется использовать промежуточное программное обеспечение для переопределения метода ответа или запроса для каждого из них, потому что промежуточное программное обеспечение выполняется для каждого запроса, и каждый раз, когда он получает вызов, вы используете процессор, а также память, потому что вы создают новую функцию.
Как вы знаете, 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);
};
Объект 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);
};
Недавно мне было нужно сделать то же самое, чтобы предоставить идентификатор свойства 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;