В прошлом году мне нужно было изучить TypeScript и React для работы. В разгар всего обучения наша команда решила преобразовать старый проект Node.js в TypeScript, чтобы лучше понять, как все работает, и повысить эффективность.
Помимо изучения других новых инструментов, таких как TypeORM, проект изначально использовал пакет dotenv, и, естественно, мы хотели сохранить его использование. Ниже приведено мое решение для сохранения первоначального использования dotenv.
Пример исходного файла конфигурации Env
В нашей среде разработки мы используем Mail Trap для проверки доставляемости, стиля и функциональности электронной почты. В приведенном ниже блоке у нас есть переменные среды почтового хоста, порта, имени пользователя и пароля из нашего файла config.env.
# Mail Trap connection info EMAIL_HOST='smtp.mailtrap.io' EMAIL_PORT=1234 EMAIL_USERNAME=1234567890 EMAIL_PASSWORD=abcdefghijklmnopqrstuvwxyz
Исходная установка DotEnv
В наших проектах Node.js у нас обычно есть настройка выполнения конфигурации в файле создания сервера. Поскольку он запускается первым в проекте, он имеет эффект нисходящей струйки, который будет использоваться во всем проекте. Это означает, что нам не нужно ссылаться на него снова вот так.
Пример интерфейса командной строки: узел server.js
// NPM Modules const dotenv = require('dotenv'); // Enable Config File dotenv.config({ path: './config.env' });
Пример использования почтовой ловушки
В приведенном ниже примере мы используем Nodemailer в качестве транспортной системы для отправки электронных писем по запросу. Обратите внимание, что использование переменных dotenv имеет определенный формат. Поскольку мы использовали переменные в верхнем регистре, нам нужно сопоставить это.
Примечание. Если вы используете VS Code, Инструмент Intellisense очень удобен.
Формат: процесс.env.ПЕРЕМЕННАЯ
newTransport() { // Mail Trap Transporter return nodemailer.createTransport({ host: process.env.EMAIL_HOST, port: process.env.EMAIL_PORT, auth: { user: process.env.EMAIL_USERNAME, pass: process.env.EMAIL_PASSWORD } }); }
Проблемы TypeScript с DotEnv
Когда вы впервые начнете миграцию на TypeScript в существующем проекте с использованием переменных dotenv, вы сразу заметите ошибки. По умолчанию TypeScript не имеет возможности доступа к области «process.env».
Мы обходим это, используя интерфейсы пространства имен, что также известно как создание нашего собственного файла «типа».
Структура файла
Нам нужно добавить папку и несколько файлов, чтобы сделать это эффективным. Для нашей команды разделение файлов было лучшим подходом к модульности. Эти файлы пользовательского типа распознаются в TypeScript, потому что соглашение об именах для них — *.d.ts. Примерный список файлов приведен ниже.
Для целей этой статьи мы работаем только с файлом «email.d.ts».
/src - - /types - - - - index.ts - - - - database.d.ts - - - - email.d.ts - - - - environment.d.ts - - - - server.d.ts
Создание вашего типового файла
В наш файл email.d.ts мы добавим приведенный ниже код. Пространство имен позволяет нам использовать основные функции узла для расширенных пользовательских возможностей. Приведенный ниже интерфейс под названием ProcessEnv позволяет нам подключиться к process.env в TypeScript. Таким образом, мы снова получаем приведенные ниже переменные.
process.env.EMAIL_HOST
process.env.EMAIL_PORT
process.env.EMAIL_USERNAME
process.env.EMAIL_PASSWORD
namespace NodeJS { export interface ProcessEnv { EMAIL_HOST: string; EMAIL_PORT: number; EMAIL_USERNAME: string; EMAIL_PASSWORD: string; } }
Мы могли бы легко добавить все переменные среды в единый интерфейс пространства имен. Хотя это эффективно для небольших проектов, наша команда выбрала модульность. Файл ниже является примером файла «environment.d.ts», который дает нам доступ к переменной «process.env.NODE_ENV».
namespace NodeJS { export interface ProcessEnv { NODE_ENV: string; } }
Результаты интерфейса
Теперь, когда мы структурировали наш проект для использования интерфейса пространства имен с именем ProcessEnv, миграция нашего проекта теперь намного проще (в частности, вращаясь вокруг переменных process.env), поскольку никаких реальных изменений не требуется. Наше использование «process.env» точно такое же, без каких-либо ошибок для переменных env.
newTransport() { // Mail Trap Transporter return nodemailer.createTransport({ host: process.env.EMAIL_HOST, port: process.env.EMAIL_PORT, auth: { user: process.env.EMAIL_USERNAME, pass: process.env.EMAIL_PASSWORD } }); }
Заключение
Мы можем легко исправить ошибки переменной process.env в TypeScript, используя наши пользовательские интерфейсы типа пространства имен. Это решит только наши ошибки для переменных среды. Полностью, ожидайте, что в процессе миграции потребуется устранить больше ошибок.
Мне больше всего нравится в этом методе то, что вы можете легко сохранить файл config.env без внесения каких-либо дополнительных существенных изменений.