Рубрики
Без рубрики

Как написать Express.js промежуточное программное обеспечение

Автор оригинала: Scott Robinson.

Вступление

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

// requires...

var app = express();

app.use("/static", express.static(__dirname + "/public"));
app.use(cookieParser('sekret'));
app.use(compress());

Последние три линии над рукояткой для нас довольно много функциональности WebApp для нас. Первый app.use () Вызов рассказывает Express, где наши статические файлы расположены и как их раскрывать, CookieParser («Sekret») Промежуточное программное обеспечение обрабатывает все разборы Cookie (с шифрованием), а последний автоматически GZIP сжимает все наши данные HTTP Code. Неплохо всего лишь три строки кода.

Эти промежуточные программы довольно типичны в вашем среднем WebApp, но вы можете найти некоторые, которые делают больше, чем просто стандартные сжатия данных или разборки файлов cookie. Возьмите это, например:

  • Шлем : Помогает защитить ваше приложение, установив различные заголовки HTTP
  • Express-Simple-CDN : Легко использовать CDN для ваших статических активов
  • Join-io : Присоединяйтесь к файлам на лету, чтобы уменьшить количество запросов HTTP-запросы
  • Паспорт : Добавляет аутентификацию пользователя для выбранных маршрутов

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

Теперь, когда вы видели некоторые примеры, вот справедливо все, что вы можете сделать с этим:

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

С бесконечными возможностями, я уверен, что у вас есть некоторые идеи, которые вы хотели бы создать, поэтому на протяжении всей этой статьи я покажу вам, как написать свое собственное промежуточное программное обеспечение. Есть несколько различных типов промежуточных программ, которые вы можете написать (приложение, маршрутизатор, обработку ошибок и т. Д.), Но в этой статье мы сосредоточимся только на уровне приложения.

Основы

Промежуточное программное обеспечение можно подумать почти так, как будто это экспресс-маршрут. Они принимают те же параметры и все, но, в отличие от обычных маршрутов, вы не должны предоставлять путь URL для промежуточного программного обеспечения. Две самые большие различия заключаются в том, как путь обрабатывается и когда он называется.

Предоставленный путь рассматривается как префикс, поэтому, если у вас было что-то вроде app.use ('/api', ...) Затем ваше промежуточное программное обеспечение будет работать, если /API называется и Если /API/пользователи называется. Это отличается от маршрутов, где путь должен быть точным совпадением.

Путь URL может быть опущена из app.use () Вызовите, если вы хотите, чтобы ваш код запустился для всех запросов, в противном случае вы можете указать путь, и ваш код выполняется только при запросе этого маршрута (и все его подпункты). Например, это может быть полезно для добавления аутентификации только на несколько заданных маршрутов.

Простое промежуточное программное обеспечение может выглядеть так:

var app = express();

app.use(function(req, res, next) {
  console.log('Called URL:', req.url);
  next();
});

В то время как обработчик маршрута выглядит так:

var app = express();
 
app.get('/', function(req, res, next) {
  res.send('Hey there...');
});

Видеть? Они в основном то же самое, поэтому писать эти функции должны чувствовать себя довольно знакомы для вас.

Используемые параметры:

  • req : Объект, содержащий всю соответствующую информацию запроса. Это может быть что-нибудь, от URL-адреса, запрошенного в корпус запроса на IP-адрес пользователя.
  • res : Это объект отклика, который используется для отправки задних данных пользователю для данного запроса. Вы можете использовать это, чтобы отправить обратно код ответа HTTP 404, или отправить обратно представленный HTML через res.render () Отказ
  • Следующий : И, наконец, Следующий Параметр – обратный вызов, чтобы сказать Express, когда наше промежуточное программное обеспечение закончено. Если вы делаете какие-либо IO (например, вызовы базы данных) или тяжелые вычисления, то вам, вероятно, нужно сделать функцию асинхронной для предотвращения блокировки основного выполнения нити, в этом случае вам придется использовать Следующий Отказ

Стоит отметить, что если ваше промежуточное программное обеспечение не заканчивается циклом ответа на запрос с помощью Res.end (...) Тогда ты Должен Позвоните Далее () пройти контроль до следующего промежуточного программного обеспечения. Если вы этого не сделаете, запрос будет оставаться на свисании и будет время ожидания.

Пример

В этом примере мы будем создавать промежуточное программное обеспечение, которое поможет вам автоматически переводить текст между языками. Это не типичный модуль I18N, хотя вместо этого мы будем использовать Google Translate.

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

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

Строки (пользовательские сообщения) выходят через API для отдыха, поэтому нам нужно будет проверить все тела маршрутов API для текста для перевода. Все строки, сохраненные в базе данных в почтовых вызовах, будут храниться на их родных языках, но все строки, извлеченные из базы данных с вызовами, будут переведены на язык, указанный в заголовок языка ACCED HTTP, который сопровождает запрос пользователя.

Я подумал, что мы не сделаем все сообщения в базе данных на одном языке, так как мы должны были бы перевести некоторые из них дважды, которые Ухудшает качество перевода Отказ

Во-первых, давайте напишем простой функцию, чтобы позвонить в API Google Translate:

var googleTranslate = require('google-translate')('YOUR-API-KEY');

var translate = function(text, lang, cb) {
	googleTranslate.translate(text, lang, function(err, translation) {
		if (!translation) cb(err, null);
		cb(err, translation.translatedText);
	});
}

Затем мы будем использовать эту функцию в нашем промежуточном коде, который экспортируется в Модули. Экспорт для использования приложением.

module.exports = function(req, res, next) {
	if (req.method === 'GET') {
		var lang = 'en';
		var langs = req.acceptsLanguages();
		if (langs[0] !== '*') {
			if (langs[0].length > 2) {
				// ex: en-US
				lang = langs[0].substring(0, 2);
			} else {
				// ex: en
				lang = langs[0];
			}
		}

		if (lang !== res.body.lang) {
			return translate(res.body.message, lang, function(err, translation) {
				res.body.message = translation;
				res.body.lang = lang;
				next();
			});
		}
	}

	next();
};

ПРИМЕЧАНИЕ : Это не так, как вы измените Ответ тело. Я просто упрощаю это ради краткости. Если вы хотите увидеть, как на самом деле изменить тело, затем проверьте сжатие промежуточное ПО, что делает это правильно. Вы должны прокси res.write.write. а также Отправить Функции, которые я не делал, потому что это будет просто отвлечением от концепций, которые я пытаюсь показать здесь.

И, наконец, мы применяем промежуточное программное обеспечение в наше приложение. Просто убедитесь, что вы называете app.use Функция после Вы уже объявили свои маршруты. Порядок, в котором он называется порядок, в котором каждая функция работает.

Кроме того, убедитесь, что вы звоните Далее () В каждом из ваших /API Маршруты, в противном случае промежуточное программное обеспечение не будет работать.

var expressGoogleTranslate = require('my-translation-middleware');

var app = express();

app.get('/api/message', function(req, res, next) {...});
app.get('/api/message/all', function(req, res, next) {...});
app.post('/api/message', function(req, res, next) {...});
app.delete('/api/message/id', function(req, res, next) {...});

app.use('/api', expressGoogleTranslate);

И это все, что есть к этому. Любая строка, возвращенная в Ответ Тело, которое является другим языком, чем то, что примет пользователь, будет переведен в Google Translate, который обнаруживает, какой язык находится в исходном тексте.

Так что, если наш ответ начал выглядеть так …

{
	"message": "The quick brown fox jumps over the lazy dog"
	"lang": "en"
}

… И пользователь принимает только Swahili, то после промежуточного программного обеспечения мы получим окончательный перевод, который выглядит так:

{
	"message": "Haraka kahawia mbweha anaruka juu ya mbwa wavivu"
	"lang": "sw"
}

Заключение

Хотя это может звучать запугивать, промежуточное ПО – Действительно Легко создавать в Express. Вы можете использовать его только для всего, независимо от того, насколько это просто или сложный.

Просто обязательно сделайте быстрый поиск по NPM за то, что вы пытаетесь сделать, поскольку несколько тонн кода уже там. Я уверен, что есть пакет уже там, который делает то, что делает мой код перевода (и, вероятно, намного лучше).

Есть ли у вас какие-либо идеи для промежуточного программного обеспечения, или как улучшить мой пример выше? Дайте нам знать об этом в комментариях!