Вся основная сила Javascript заключается в бесчисленном множестве потрясающих пакетов, находящихся в открытом доступе. Главное, не забывать хотя бы иногда благодарить их создателей вознаграждением. Ведь разработчики, как все люди, платят налоги и покупают продукты.
Знакомьтесь: 7 классных пакетов, которые вы можете начать использовать уже сегодня.
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 является межплатформенным 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 применяется для стилизации терминалов.
Включает в себя следующие особенности:String.prototype
;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 помогает достоверно выяснить размер окна терминала.
Process.stdout.columns
не существует в случае, когда запущен неинтерактивно. Например в придаточных процессах или в конвейерной цепочке. Этот модуль работает, даже когда все файловые дескрипторы телетайпа переадресованы.
termSize()
— возвращает объект со свойствами колонок и рядов.
Имейте в виду, что этот пакет работает на macOS, Linux и Windows.
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);
Примеры
Так выглядит вывод примера скрипта, отображенный службой перехвата сообщений Ethereal:
Отправка писем через NodemailerNode MySQL — драйвер node.js, предназначенный для MySQL. Он написан на JavaScript, не требует компиляции и имеет 100% лицензию MIT.
УстановкаЭтот Node.js модуль доступен через реестр npm.
Перед его установкой необходимо скачать и установить Node.js версии 6.0 или более поздней.
Далее процесс установки запускается командой npm install
:
Информацию о предыдущих релизах версий 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
разъединяет части процесса логирования, делая его более гибким и расширяемым. Существенное внимание уделено поддержке гибкости уровней, процесса форматирования логов, а также обеспечению того, что API, отделенные от реализации транспортного логирования (имеется в виду процесс хранения и индексирования логов), будут представлены программисту.
Для использования 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 для применения в одном из текущих или будущих проектов.
Еще раз хочу призвать вас не забывать о спонсорской поддержке авторов таких замечательных пакетов. Эти люди действительно многое делают бесплатно и отдают часть себя миру. Давайте ответим им взаимностью.
Перевод статьи Indrek Lasn: Here Are 7 Useful Node Packages (Open Source and Free to Use!)
Комментарии