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

Как построить сервер отчета в сервере без сервера с функциями Azure и SendGrid

Это 2018 год, и я только что написал заголовок, который содержит слова «сервер без сервера». Жизнь не имеет смысла. Несмотря на то, что совершенно противоречивое заголовок, в этой статье мы собираемся изучить довольно нефтепорт, чтобы использовать функциональность шаблона SendGrid, используя триггеры таймера в функциях Azure, чтобы отправить

Автор оригинала: Burke Holland.

Это 2018 год, и я только что написал заголовок, который содержит слова «сервер без сервера». Жизнь не имеет смысла.

Несмотря на то, что совершенно противоречивый заголовок, в этой статье мы собираемся изучить довольно нефтеатлогируйте функциональность шаблона SendGrid, используя триггеры таймера в Функции Azure Чтобы отправить запланированные табличные отчеты. Мы делаем это, потому что это то, что все хотят в их почтовом ящике. Отчет. С номерами в нем. И желательно некоторые аббревиатуры.

Отчет о запасе SKU

Во-первых, давайте соломенным человеком в этом проекте с придумыванным приложением, которое выглядит достаточно скучно, чтобы гарантировать отчет. У меня только то вещь. Сайт, где мы можем настроить уровень инвентаризации. Слово «инвентарь» просто просит отчет.

Это приложение позволяет настроить количество запасов (последнюю колонку). Давайте скажем, что исполнительный директор где-то просил, чтобы мы отправили им доклад каждую ночь, которые содержат список каждого SKU, измененных за последние 24 часа. Из-за, конечно, они попросили бы этого. На самом деле, я мог бы понуслиться, я построил этот отчет в реальной жизни в прошлой работе. Или в матрице есть глюк. В любом случае, мы делаем это.

Вот что мы собираемся строить …

Обычно способ, которым вы построили это с каким-то сервером отчетов. Нечто вроде служб отчетности SQL Server или бизнес-объекты или другие другие серверы отчетов. Честно говоря, я не хочу знать. Но если у вас нет сервера отчетов, это становится добрым утомительным.

Давайте пойдем за то, что вы должны сделать, чтобы это произошло …

  1. Запустить работу в каком-то таймере (задание CRON)
  2. Запрос база данных
  3. Итайте перезаписывайте и форматируйте их для вывода на экран
  4. По электронной почте сказал отчет
  5. Обновите свое резюме и свяжитесь с рекрутерами

Это то, что никто не хочет делать. Но Я думаю Этот проект может быть очень весело, и мы можем использовать некоторые интересные технологии, чтобы вытащить его. Начиная с сервера.

Функции таймера без сервеса

Serverless – это действительно хорошее использование чехол для одноразовых запросов, таких как это. В этом случае мы можем использовать функции Azure для создания функции триггера таймера.

Для этого я собираюсь использовать расширение функций Azure для кода VS. Я собираюсь использовать его для всего на самом деле. Почему? Потому что я вас не знаю, но я знаю, что это очень вероятно, что вы используете VS-код. VS код отлично, потому что это как фильм, который все разработчик может универсально согласен, является совершенно потрясающим. Вроде противоположность «детям мужчин». Этот фильм был ужасным, и вы это знаете.

Убедитесь, что вы устанавливаете расширение функций Azure.

Функции Azure – Visual Studio Marketplace Расширение для визуального студийного кода – расширение функций Azure для Visual Studio Code. marketplace.visualstudio.com

Теперь создайте новое приложение для функций из-под кода VS.

Затем создайте новую функцию триггера таймера. Функции триггера таймера запланированы с использованием стандартных выражений CRON. Вы, скорее всего, никогда не видели раньше, потому что я не видел одного до нескольких месяцев назад. И я был в этой отрасли долгое время. Я старый, отец Уильям.

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

Теперь мы можем запустить это локально (F5). Мы увидим в встроенном терминале расписание, на которую будет называться наша функция; следующие 5 вхождений.

Это чувствует себя хорошо, человек.

Хорошо, теперь нам нужно получить некоторые данные. Я не собираюсь тащить вас в специфику мне запрос SQL Server из этой функции, потому что это не то, о чем эта статья, но вот в любом случае код.

const { Connection, Request } = require('tedious');

const options = {
  weekday: 'long',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
};

const config = {
  userName: process.env.SQL_USERNAME,
  password: process.env.SQL_PASSWORD,
  server: process.env.SQL_SERVER,
  options: {
    encrypt: true,
    database: process.env.SQL_DATABASE
  }
};

module.exports = function(context, myTimer) {
  getChangedSkus()
    .then(data => {
      if (data.length > 0) {
        sendEmail(context, data);
      } else {
        context.done();
      }
    })
    .catch(err => {
      context.log(`ERROR: ${err}`);
    });
};

/**
 * Executes a query against the database for SKU's changed in the last 24 hours
 * @returns {Promise} Promise object contains result of query
 */
function getChangedSkus() {
  return new Promise((resolve, reject) => {
    const connection = new Connection(config);
    const query = `SELECT Sku, Quantity, CONVERT(varchar, Modified, 0) as Modified
                   FROM Inventory
                   WHERE Modified >= dateadd(day, -1, getdate())`;

    connection.on('connect', err => {
      if (err) reject(err);

      let request = new Request(query, err => {
        if (err) {
          reject(err);
        }
      });

      const results = [];
      request.on('row', columns => {
        let result = {};
        columns.forEach(column => {
          result[column.metadata.colName] = column.value;
        });

        results.push(result);
      });

      request.on('doneProc', (rowCount, more) => {
        resolve(results);
      });

      connection.execSql(request);
    });
  });
}

Я подключаюсь к базе данных, делая простой запрос и …wait в минуту … Разве я не сказал, я не был собираюсь попасть в специфику? У тебя там было там минуту, но я на твою игру!

Таким образом, это тянет данные, и мы получаем его в объекте JavaScript, который мы можем пройти как JSON. Если бы мы были в Json.stringify Это, мы увидим набор данных, которые нам нужно отправить в отчет.

[
  { "Sku": "1", "Quantity": 65, "Modified": "Nov  6 2018 10:14PM" },
  { "Sku": "10", "Quantity": 89, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "11", "Quantity": 39, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "12", "Quantity": 2, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "13", "Quantity": 75, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "14", "Quantity": 85, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "15", "Quantity": 58, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "16", "Quantity": 2, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "17", "Quantity": 48, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "18", "Quantity": 68, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "19", "Quantity": 67, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "2", "Quantity": 5, "Modified": "Nov  6 2018 11:18PM" },
  { "Sku": "20", "Quantity": 37, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "21", "Quantity": 54, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "22", "Quantity": 21, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "23", "Quantity": 46, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "24", "Quantity": 55, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "25", "Quantity": 21, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "26", "Quantity": 42, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "27", "Quantity": 65, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "28", "Quantity": 74, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "29", "Quantity": 33, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "3", "Quantity": 51, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "4", "Quantity": 96, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "5", "Quantity": 27, "Modified": "Nov  6 2018 11:18PM" },
  { "Sku": "6", "Quantity": 13, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "7", "Quantity": 54, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "8", "Quantity": 89, "Modified": "Nov  2 2018  8:18PM" },
  { "Sku": "9", "Quantity": 56, "Modified": "Nov  2 2018  8:18PM" }
]

OK! У нас есть данные, теперь нам просто нужно сделать это красивым и отправить его по электронной почте кому-то, кому нам не нравится. Как мы будем делать это? С Sendgrid!

Настройка Sendgrid

SENDGRID – это нефте-сервис с действительно хорошей приборной панелью. Тебе понравится. Или вы не будете. В любом случае, вы должны использовать его, чтобы пройти через этот блог.

Вы можете создать бесплатную учетную запись, если у вас его еще нет. Это много для того, что мы здесь делаем сегодня.

Как только вы создадите отчет, SENDGRID собирается бросить вас в свою «приборную панель». С этой приборной панели необходимо создать новое приложение API и получите ключ.

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

Скопируйте этот ключ в проект ваших функций Azure. Положить его в local.settings.json Файл, чтобы вы могли получить доступ к нему в качестве переменной среды Node.js позже.

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=reporttimerstorage;AccountKey=OJVYCHI0GhtIm5XZdsDzGZFraJD/v/rfPwMSu4B72Kf5/O7oCrOQKNAFkQ==",
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "SENDGRID_API_KEY": "SG.rlpDOy3EQNOTChnzpa1COPYg.G4MYlEYhwHk0RyvuGcY_xKEYbhQoFTtPB9A9-5ZaYQ"
  }
}

Теперь мы собираемся создать шаблон в SENDGRID. Это то, что мы будем использовать для разработки нашего доклада. SENDGRID имеет что называется «транзакционные шаблоны». Я понятия не имею, почему их называют это, но нам будет нуждаться в одном.

Как только вы создадите новый, вы должны создать новую «версию». У меня было весело тяжело выяснить это. Но опять же, мой мозг тан на маленькой стороне мало.

Выберите, чтобы разработать свой шаблон с помощью редактора кода. Вам не нужен безрезультатный редактор дизайнера!

Sendgrid Поддержка рулей, который является синтаксисом шаблона, который так просто, даже я могу это сделать. В редакторе кода вы можете вставить данные JSON в вкладку «Тестовые данные» …

Теперь переиграйте данные, используя его ключевое имя от JSON …

Это прекрасно! Я плачу. Отправим его.

ХОРОШО. Отлично. Мы сделаем это немного приятнее на старых глазных яблоках. Вот стиль, который я бесстыдно сорвал из великолепных Bulma CSS Framework Отказ



Modified SKUs

The following SKU's were modified in the last 24 hours

{{#each Skus}} {{/each}}
Sku Quantity Last Modified
{{Sku}} {{Quantity}} {{Modified}}

Это нормально, на данный момент, чтобы вы были слышно впечатлены.

Теперь вы могли бы заметить, что предмет электронной почты отсутствует. Как мы заполним это? Что ж, после очередного смущающего периода неудачи, а затем самоанализ, я понял, что оно за значок «Настройки» слева. Вы просто должны пройти ценность в вашем JSON для «темы».

Теперь нам нужно получить идентификатор шаблона и добавить его в наши функции Azure. Сохраните этот шаблон и выберите идентификатор с главного экрана шаблона.

Бросить его в доверие local.settings.json Файл прямо под ключ API SENDGRID.

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=reporttimerstorage;AccountKey=OJVYCHI0GhtIm5XZdsDzGZFraJD/v/rfPwMSu4B72Kf5/O7oCrOQKNAFkQ==",
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "SENDGRID_API_KEY": "SG.rlpDOy3EQNOTChnzpa1COPYg.G4MYlEYhwHk0RyvuGcY_xKEYbhQoFTtPB9A9-5ZaYQ"
    "SENDGRID_TEMPLATE_ID": "d-3e33c1453cf7457fb06e6d30519bd422"
  }
}

Теперь мы готовы передать наши данные из нашей функции Azure для SendGrid и отправлять эту невероятную работу делового искусства.

Привязки SENDGRID для функций Azure

Функции Azure обеспечивают привязку для SendGrid. Если вы создаете функцию через портал Azure, он создаст эту привязку для вас при выборе шаблона «SendGrid». Если вы делаете это локально, как я, вы должны добавить его самостоятельно.

Сначала вам нужно открыть function.json Файл для Createerorport Функция и добавить в привязку SENDGRID.

{
   "type": "sendGrid",
   "name": "message",
   "apiKey": "SENDGRID_API_KEY",
   "to": "youremail@company.com",
   "from": "hahabusiness@businesstime.com",
   "direction": "out"
}

Привязка Sendgrid поставляется в качестве расширения для функций Azure. Запустите следующую команду в терминале, чтобы установить его.

Microsoft.Azure.WebJobs.Extensions.SendGrid -Version 3.0.0

Когда вы запускаете эту команду, VS Code попросит вас восстановить некоторые зависимости. Вы можете нажать Restore. Ничего плохого не произойдет … Или не будет?!

Еще одна вещь, которую вам нужно сделать, это настроить ваш Extensions.csproj Файл для ссылки последней библиотеки SENDGRID. Это необходимо для использования динамических шаблонов.

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

OK! Теперь мы готовы отправить электронное письмо через наш шаблон SendGrid. Вот код, чтобы сделать это. Это удручающе просто. После всего этого я знаю, что ты надеялся на достаточно кода, чтобы задушить кошку (что? Вы никогда не слышали эту метафору раньше?), Но это все, что нужно.

function sendEmail(context, data) {
  context.done(null, {
    message: {
      /* you can override the to/from settings from function.json here if you would like
        to: 'someone@someplace.com',
        from: 'someone@anotherplace.com'
        */
      personalizations: [
        {
          dynamic_template_data: {
            Subject: `Tailwind SKU Report For ${new Date().toLocaleDateString(
              'en-US',
              options
            )}`,
            Skus: data
          }
        }
      ],
      template_id: process.env.SENDGRID_TEMPLATE_ID
    }
  });
}

Предметы обратите внимание, что я проходящий в теме как часть JSON. А также тот факт, что вы можете переопределить на/из адресов, указанных в function.json файл здесь.

Теперь вы можете запустить свою функцию и подождать 24 часа, чтобы проверить его!

Нет, но серьезно – как вы вручную проверите триггер таймера, не модифицируя работу чертовски Cron?

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

Таймер тестирования триггеры с HTTP Triggers

Я создаю HTTP Trigger в том же проекте и вызовите его «RunCreatereport». В этой функции я просто импортирую и называю функцию таймера.

const index = require('../CreateReport/index');

module.exports = function(context, req) {
  // This is a tester function that manually executes the CreateReport timer function
  index(context);
};

Единственным недостатком этого является то, что вы должны повторить настройки привязки SENDGRID от function.json В «CreateReorport» в «Runcreatereport» Функция.json. . Но кроме этого это работает просто хорошо. Теперь вы можете запустить эту вещь, выпустите браузер и нажмите на URL, который немедленно позвонит в функцию таймера. Вы можете проверить, не касаясь, что ICKY старое выражение Cron.

Haha Business

Теперь посмотри проверяйте свою электронную почту и греться в славе отчета. Обратите внимание, что вам не нужно иметь адрес электронной почты для отправки из SendGrid. Вы можете буквально отправить с любого адреса. Шутки в сторону. Идти вперед и попробуй. Просто подумайте о том, что вы можете сделать с этой силой.

Вот как выглядит мой почтовый ящик. Головы, это идет в мусор. Вероятно, потому что у меня нет адреса электронной почты отправителя.

КАКИЕ? Там «конференция по устойчивости бизнеса»? OMG столько бизнеса. Могу поспорить, что эти люди получают много отчетов.

Вы можете получить этот проект от GitHub.

Burkeholland/Serverless-SendGrid-отчет Вклад в разработку Burkeholland/Serverless-SendGrid-отчет, создавая учетную запись в GitHub. github.com

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

Оригинал: “https://www.freecodecamp.org/news/how-to-build-a-serverless-report-server-with-azure-functions-and-sendgrid-3c063a51f963/”