Node.js - это новый бэкэнд, предназначенный для того, чтобы помочь программистам быстро создавать масштабируемые приложения. Node.js имеет много привлекательных функций, и есть бесчисленное количество сообщений об этом. Эта статья проанализирует и обсудит функции EventEmitter, потоков, стиль кодирования, личинга, стиля кодирования и других, чтобы помочь пользователям лучше понять Node.js.
В качестве платформы, построенной в среде выполнения Chrome JavaScript, наше соответствующее понимание JavaScript, похоже, применимо к приложениям узлов; Без дополнительных языковых расширений или модификаций мы можем применить опыт программирования фронт-энда к контрольному программированию.
EventEmitter (отправитель событий)
Прежде всего, вы должны понять модель EventEmitter. Он может отправить мероприятие, а также мероприятие, которое заинтересован потребителям. Мы можем думать об этом как о расширении шаблона обратного прохода на асинхронную функцию. В частности, EventEmitter будет иметь больше преимущества, когда потребуется несколько вызовов.
Например, вызывающий абонент отправляет запрос «файл списка» на удаленный сервер. Возможно, вы захотите сгруппировать возвращенные результаты и выполнить обратный вызов для каждой группы. Модель EventEmitter позволяет отправлять обратные вызовы «файл» в каждой группе и выполнять обработку «конец» при завершении операций.
При использовании EventEmitter просто установите соответствующие события и параметры.
Кода -копия выглядит следующим образом:
var EventEmitter = require ('events'). EventEmiter;
var util = require ('util');
Функция myClass () {
if (! (Этот экземпляр myclass)) вернуть новый myclass ();
Eventemitter.call (это);
var self = это;
setTimeout (function TimeOutcb () {
self.emit ('myevent', 'Hello World', 42);
}, 1000);
}
util.inherits (myclass, eventemitter);
Конструктор MyClass создает триггер времени с задержкой триггера 1S и спусковым событием Myevent. Чтобы использовать связанные события, вам необходимо выполнить метод on ():
Кода -копия выглядит следующим образом:
var myobj = new myclass ();
var start = date.now ();
myobj.on ('myevent', function myeventcb (str, num) {
console.log ('myevent запускается', str, num, date.now () - start);
});
Здесь следует отметить, что, хотя подписанное событие EventEmitter является асинхронным событием, когда время запускается, действия слушателя будут синхронизированы. Поэтому, если вышеупомянутое событие Myevent имеет 10 слушателей, все слушатели будут вызваны в порядке, не ожидая цикла событий.
Если подкласс EventEmitter генерирует событие EMIT («Ошибка»), но ни один прослушиватель не подписывается на него, базовый класс EventEmitter вызывает исключение, вызывая событие несаоглексирования, которое будет инициировано при выполнении объекта процесса.
Веррор
Verror - это расширение ошибки базового класса, которая позволяет нам определять выходные сообщения с помощью формата символов PrintF.
Потоки
Если есть очень большой файл, который необходимо обработать, идеальный метод должен быть для прочтения части и записи части. Независимо от того, насколько велик файл, он всегда будет обрабатываться до тех пор, пока позволяет время. Это требует концепции потоковой передачи. Streams - еще одна широко используемая модель в узле, в узле, реализация EventEmitter. Обеспечивает читаемые, записи или полные дуплексные интерфейсы. Это абстрактный интерфейс, и представленные регулярные операционные события включают в себя: читаемый, записываемый, дренаж, данные, конец и закрытие. Если мы сможем использовать трубопроводы для эффективной интеграции этих событий, будет достигнуто более мощные взаимодействия.
Используя .pipe (), примечание может общаться с обратным давлением через трубопровод. Обратное давление означает: только те, которые могут быть написаны, или только те, которые можно прочитать.
Например, теперь мы отправляем данные из Stdin в локальный файл и удаленный сервер:
Кода -копия выглядит следующим образом:
var fs = require ('fs');
var net = require ('net');
var localfile = fs.createwritestream ('localfile.tmp');
net.connect ('255.255.255.255', 12345, функция (клиент) {
process.stdin.pipe (клиент);
Process.stdin.pipe (LocalFile);
});
И если мы хотим отправить данные в локальный файл и хотим использовать Gunzip для сжатия этого потока, мы можем сделать это:
Кода -копия выглядит следующим образом:
var fs = require ('fs');
var zlib = require ('zlib');
process.stdin.pipe (zlib.creategunzip ()).
Если вы хотите узнать больше о потоке, нажмите здесь.
Поток управления (управление процессом)
Поскольку JS имеет функциональные концепции, такие как первоклассные объекты, закрытия и т. Д., Можно легко определить разрешения обратного вызова. Это очень удобно при прототипировании и может интегрировать логические разрешения по требованию. Но это легко использовать неуклюжие встроенные функции.
Например, мы хотим прочитать серию файлов по порядку, а затем выполнить задачу:
Кода -копия выглядит следующим образом:
fs.readfile ('firstfile', 'utf8', function firstcb (err, firstfile) {
DOSOMETH (FirstFile);
fs.readfile ('secondfile', 'utf8', function seconcb (err, secondfile) {
что -то (второй файл);
fs.readfile ('thirdfile', 'utf8', function thirdcb (err, thirdfile) {
что -то (третий файл);
});
});
});
Проблемы с этим шаблоном:
1. Логика этих кодов очень разбросана и беспорядочна, и связанные с ними оперативные процессы трудно понять.
2. Ошибки или исключения не обрабатываются.
3. Утечки за закрытие памяти в JS очень распространены и трудно диагностировать и обнаружить.
Если мы хотим выполнить серию асинхронных операций на входном наборе, использование библиотеки управления процессами является более умным выбором. Vasync используется здесь.
Vasync - это библиотека управления процессами, идеи которых происходят из асинхронных операций. Что делает его особенным, так это то, что он позволяет потребителям просматривать и наблюдать за определенным процессом задачи. Эта информация очень полезна для изучения процесса определенной ошибки.
Стиль кодирования (стиль программирования)
Стиль программирования - самая спорная тема, потому что он часто случайный. У каждого есть свои предпочтения. Важно найти стиль, который подходит для людей и команд. Некоторое традиционное наследие может сделать путешествие по развитию узлов лучше.
1. Назовите функцию
2. Попробуйте назвать все функции.
3. Избегайте закрытия
4. Не определяйте другие функции в определенной функции. Это уменьшает много неожиданных несчастных случаев утечки утечки памяти.
5. больше и меньшие функции
Хотя V8 JIT является мощным двигателем, меньшие и более тонкие функции будут лучше в сочетании с V8. Кроме того, если все наши функции являются небольшими и изысканными (около 100 строк), мы также будем благодарить себя при чтении и поддержании их сами.
Проверьте стиль программно: поддерживайте последовательность стиля и используйте инструмент проверки для его улучшения. Мы используем jsstyle.
Linting (проверка кода)
Инструмент Lint может выполнить статический анализ кода без запуска, проверяя на наличие потенциальных ошибок и рисков, таких как отсутствующие операторы в случае передачи. Lint не просто эквивалентен проверке стиля, он больше нацелен на объективный анализ рисков, а не на выбор субъективного стиля. Мы используем JavaScriptLint, который имеет богатые чеки.
Ведение журнала (ведение ведения)
Когда мы программируем и кодируем, нам нужно иметь долгосрочное видение. В частности, подумайте, какие инструменты использовать для отладки. Отличный первый шаг - сделать эффективную регистрацию. Нам нужно определить информацию и посмотреть, на что уделяется особое внимание во время отладки, и что используется для анализа и исследований во время выполнения. Рекомендуется использовать Bunyan, библиотеку журнала Direct Node.js, а формат вывода данных - JSON. Для получения дополнительной информации, пожалуйста, нажмите здесь.
Клиентский сервер
Если приложение имеет распределенные возможности обработки, оно будет более привлекательным на рынке. Подобные интерфейсы можно описать с использованием HTTP Restful API или оригинального TCP JSON. Это позволяет разработчикам объединять опыт в узле с асинхронными сетевыми средами, а также использование потоков с распределенными и масштабируемыми системами.
Общие инструменты:
1. RESTIFY
Проще говоря, это инструмент для создания услуг REST. Он обеспечивает хорошую поддержку просмотра и отладки при поддержке Bunyan и DTRACE.
2. Быстро
Fast - это легкий инструмент, который использует TCP для обработки сообщений JSON. Предоставлена поддержка DTRACE, что позволяет нам быстро идентифицировать характеристики производительности серверных клиентов.
3. Рабочий процесс
Рабочий процесс построен на Restify и может определять бизнес -процессы для серии удаленных услуг и API. Например: статус ошибки, тайм -аут, переподключение, обработка перегрузки и т. Д.