Вся основная сила Javascript заключается в бесчисленном множестве потрясающих пакетов, находящихся в открытом доступе. Главное, не забывать хотя бы иногда благодарить их создателей вознаграждением. Ведь разработчики, как все люди, платят налоги и покупают продукты.
Знакомьтесь: 7 классных пакетов, которые вы можете начать использовать уже сегодня.
Commander.js
Commander выступает как полноценное решение для интерфейсов командной строки node.js, вдохновленное приложением commander на Ruby.
Установка
npm install commander
Определение программных переменных
Commander экспортирует глобальный объект, что весьма удобно для небольших быстрых программ.
const program = require('commander');
program.version('0.0.1');
Для более объемных программ, способных использовать commander в различных задачах, включая тестирование, рекомендуется создавать локальный объект Command.
const commander = require('commander');
const program = new commander.Command();
program.version('0.0.1');
Команды
Вы можете задавать подкоманды для команды высшего уровня при помощи .command
. Это можно сделать двумя способами: с помощью обработчика действий, привязанного к команде или в виде отдельного исполняемого файла (описание см. ниже). В первом случае к .command
вы добавляете имя команды и необходимые аргументы. Этими аргументами могут быть <required>
, <optional>
или variadic
.
Например:
// Команда реализована посредством обработчика действий (описание расположено отдельно от `.command`)
// Возвращает новую команду для конфигурирования.
program
.command('clone <source> [destination]')
.description('clone a repository into a newly created directory')
.action((source, destination) => {
console.log('clone command called');
});
// Команда выполнена с помощью отдельного исполняемого файла (описание выступает вторым параметром `.command`)
// Возвращает команду высшего уровня для присоединения дополнительных команд.
program
.command('start <service>', 'start named service')
.command('stop [service]', 'stop named service, or all if no name supplied');
Для полного ознакомления можете изучить прилагаемое официальное руководство.
Passport
Passport является межплатформенным Express-совместимым авторизационным ПО для Node.js.
Единственная задача Passport — аутентификация запросов, которая осуществляется посредством расширяемого набора плагинов, называемых стратегиями. Passport не прописывает никаких маршрутов или схем баз данных, что максимально увеличивает его гибкость и позволяет разработчику производить настройки на уровне приложений. Интерфейс программирования в этом случае прост: вы запрашиваете у Passport аутентификацию запроса, а он в свою очередь определяет для этого запроса перехватчики, которые отслеживают успех или провал этой аутентификации.
Установка
$ npm install passport
Пользовательские стратегии
Для аутентификации запросов Passport использует такое понятие, как стратегии. Стратегии могут включать проверку имени пользователя и пароля, делегированную аутентификацию при помощи OAuth или федеративную аутентификацию посредством OpenID.
Любая из предполагаемых стратегий нуждается в предварительной настройке.
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
if (!user.verifyPassword(password)) { return done(null, false); }
return done(null, user);
});
}
));
Всего существует более 480 различных стратегий, которые вы можете подробно изучить и использовать на passportjs.org.
Сессии
Passport способен поддерживать устойчивые сессии. Для этого авторизованный пользователь должен быть сериализован в сессии и десериализован, как только будут выполнены необходимые запросы.
Passport не накладывает никаких ограничений на способы хранения пользовательских записей. Вместо этого вы определяете его функции так, что он в последствии производит необходимый логический процесс сериализации и десериализации. В типичном приложении это будет так же просто, как сериализация пользовательского ID с последующим нахождением пользователя по этому ID при десериализации.
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function (err, user) {
done(err, user);
});
});
Посетите официальный сайт Passport для более детального ознакомления с проектом.
Chalk
Chalk применяется для стилизации терминалов.
Включает в себя следующие особенности:
- Выразительный API;
- Высокая производительность;
- Возможность вкладывать стили друг в друга;
- Поддержка цветовых схем 256/Truecolor;
- Авто-определение поддержки цветов;
- Не расширяет
String.prototype
; - Чистый и сфокусированный;
- Активно поддерживаемый;
- По информации на 1 октября 2019 г., применяется в более, чем 46 000 пакетов;
Установка
$ npm install chalk
Использование
const chalk = require('chalk');console.log(chalk.blue('Hello world!'));
Chalk оснащен удобным API, в котором вы можете связывать и вкладывать желаемые стили.
const chalk = require('chalk');
const log = console.log;
// Объединяет стилизованные и обычные строки
log(chalk.blue('Hello') + ' World' + chalk.red('!'));
// Совмещает множественные стили посредством цепного API
log(chalk.blue.bgRed.bold('Hello world!'));
// Прописываем аргументы
log(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz'));
term-size
Пакет Term-size помогает достоверно выяснить размер окна терминала.
Process.stdout.columns
не существует в случае, когда запущен неинтерактивно. Например в придаточных процессах или в конвейерной цепочке. Этот модуль работает, даже когда все файловые дескрипторы телетайпа переадресованы.
Установка
$ npm install term-size
Использование
const termSize = require('term-size');termSize();
//=> {колонки: 143, ряды: 24}
Term size имеет краткий и приятный API
termSize()
— возвращает объект со свойствами колонок и рядов.
Дополнительно
- term-size-cli — CLI для этого модуля.
Имейте в виду, что этот пакет работает на macOS, Linux и Windows.
Nodemailer
Nodemailer — модуль, разработанный для приложений Node.js, который позволяет очень легко отправлять e-mail. Этот проект был начат в 2010, когда еще не было удобного способа отправки таких сообщений. Сегодня же это одно из решений, которое пользователи Node.js применяют по умолчанию.
Nodemailer имеет лицензию MIT, которую подробно можно изучить на ее странице. Если вы производите апгрейд с версии v2 или более старой, то обратитесь к руководству по облегченной установке здесь.
Установка
npm install nodemailer
Демонстрационный код Nodemailer
Здесь представлен полноценный образец отправки e-mail с простым текстом и HTML телом.
const nodemailer = require('nodemailer');
// async..await не разрешен глобально, используйте обёртку.
async function main() {
// Создает тестовый SMTP аккаунт на ethereal.email
// Потребуется, только если у вас нет иного активного email аккаунта для тестирования
let testAccount = await nodemailer.createTestAccount();
// создаём переиспользуемый транспортёр, используя транспорт SMTP по умолчанию.
let transporter = nodemailer.createTransport({
host: 'smtp.ethereal.email',
port: 587,
secure: false, // подтверждение для 465, опровержение для других портов
auth: {
user: testAccount.user, // создан пользователь ethereal
pass: testAccount.pass // создан пароль ethereal
}
});
// отправить почту с определенным транспортным объектом
let info = await transporter.sendMail({
from: '"Fred Foo ?" <[email protected]>', // адрес отправителя
to: '[email protected], [email protected]', // список получателей
subject: 'Hello ✔', // Строка темы
text: 'Hello world?', // тело основного текста
html: '<b>Hello world?</b>' // тело html
});
console.log('Message sent: %s', info.messageId);
// Сообщение отправлено: <[email protected]>
// Предпросмотр доступен только при отправке через аккаунт Ethereal
console.log('Preview URL: %s',
nodemailer.getTestMessageUrl(info));
// URL предпросмотра:
https://ethereal.email/message/WaQKMgKddxQDoou...
}
main().catch(console.error);
Примеры
- Nodemailer AMQP является примером использования RabbitMQ для управления e-mail сообщениями Nodemailer. Источник.
Так выглядит вывод примера скрипта, отображенный службой перехвата сообщений Ethereal:
Node MySQL
Node MySQL — драйвер node.js, предназначенный для MySQL. Он написан на JavaScript, не требует компиляции и имеет 100% лицензию MIT.
Установка
Этот Node.js модуль доступен через реестр npm.
Перед его установкой необходимо скачать и установить Node.js версии 6.0 или более поздней.
Далее процесс установки запускается командой npm install
:
$ npm install mysql
Информацию о предыдущих релизах версий 0.9.х вы можете получить в разделе v.0.9.
Иногда пакет требует установить последнюю версию с Github для проверки работоспособности программных исправлений. Это можно сделать следующим образом:
$ npm install mysqljs/mysql
Установка соединений
Ниже указан рекомендованный способ установки соединения с базой данных:
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'example.org',
user : 'bob',
password : 'secret'
});
connection.connect(function(err) {
if (err) {
console.error('error connecting: ' + err.stack);
return;
}
console.log('connected as id ' + connection.threadId);
});
Пример кода
Здесь приведен пример использования пакета:
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'me',
password : 'secret',
database : 'my_db'
});
connection.connect();
connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
});
connection.end();
В этом примере указано следующее:
- Каждый метод, применяемый к соединению, определяется в очередь и выполняется согласно ей.
- Завершение соединения производится через команду
end()
, которая следит, чтобы все оставшиеся запросы были выполнены до отправки завершающего пакета на сервер MySQL.
Для полноценного изучения темы посетите официальный репозиторий на Github.
winston
Пакет winston
был разработан как простая и универсальная библиотека логирования с поддержкой множества транспортов. В данном случае они в большей степени выступают в качестве хранилища ваших логов.
Каждый логгер winston
имеет возможность настраивать эти средства на различных уровнях. Например, вы можете хранить логи ошибок в определенной удаленной единице (базе данных, к примеру), но в то же время все логи выводить на консоль или в локальный файл.
winston
разъединяет части процесса логирования, делая его более гибким и расширяемым. Существенное внимание уделено поддержке гибкости уровней, процесса форматирования логов, а также обеспечению того, что API, отделенные от реализации транспортного логирования (имеется в виду процесс хранения и индексирования логов), будут представлены программисту.
Установка
npm i winston
Использование
Для использования winston
рекомендуется создать свой собственный логгер. Проще всего сделать это через команду winston.createLogger
:
const winston = require('winston');const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
defaultMeta: { service: 'user-service' },
transports: [
//
// - Запись всех логов с уровнем "info" и ниже в `combined.log`
// - Запись уровня error и ниже в `error.log`.
//
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
//
// Если мы не находимся в продакшене, тогда логируем в `console` в таком формате:
// `${info.level}: ${info.message} JSON.stringify({ ...rest }) `
//
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({
format: winston.format.simple()
}));
}
Вы также можете логировать напрямую через встроенный логгер, отображаемый вводом require('winston')
, но этот способ не очень удобный.
Здесь доступна подробная документация по API.
Заключение
Надеюсь вы нашли хотя бы один полезный пакет Node для применения в одном из текущих или будущих проектов.
Еще раз хочу призвать вас не забывать о спонсорской поддержке авторов таких замечательных пакетов. Эти люди действительно многое делают бесплатно и отдают часть себя миру. Давайте ответим им взаимностью.
Читайте также:
- Как создать инструмент командной строки в NodeJS
- Как создать Meetup+Slack приложение с помощью Standard Library и Node.js
- 10 лучших фреймворков Node.js
Перевод статьи Indrek Lasn: Here Are 7 Useful Node Packages (Open Source and Free to Use!)