Использование пакета SDK Node.js для функции "Мобильные приложения"

Эта статья содержит подробную информацию о программировании серверной части на платформе Node.js в компоненте "Мобильные приложения" службы приложений Azure, а также соответствующие примеры.

Введение

Функция "Мобильные приложения" позволяет добавлять веб-API в веб-приложения для доступа к данным, оптимизированным для мобильных устройств. Пакет SDK для функции "Мобильные приложения" используется в веб-приложениях ASP.NET и Node.js. С помощью этого пакета SDK выполняются следующие операции:

  • Табличные операции (чтение, вставка, обновление, удаление данных).
  • Пользовательские операции API.

Операции обоих типов поддерживают проверку подлинности для всех поставщиков удостоверений, разрешенных службой приложений Azure. К этим поставщикам относятся поставщики удостоверений социальных сетей, таких как Facebook, Twitter, Google и Майкрософт, а также Azure Active Directory для корпоративной проверки подлинности.

Примеры для каждого варианта использования можно найти в каталоге примеров на сайте GitHub.

Поддерживаемые платформы

Пакет SDK Node.js для функции "Мобильные приложения" поддерживает текущий выпуск LTS Node и более поздние версии. Сейчас последней версией LTS является Node 4.5.0. Другие версии Node могут также работать, но они не поддерживаются.

Пакет SDK Node.js для функции "Мобильные приложения" поддерживает два драйвера базы данных:

  • Драйвер node-mssql поддерживает Базу данных SQL Azure и локальные экземпляры SQL Server.
  • Драйвер sqlite3 поддерживает базы данных SQLite только в отдельном экземпляре.

Создание базовой серверной части на основе Node.js с помощью командной строки

Каждая серверная часть на Node.js функции "Мобильные приложения" запускается как приложение ExpressJS. ExpressJS является наиболее популярной платформой веб-служб для Node.js. Вот как создать простое приложение Express :

  1. В командной строке или окне PowerShell создайте каталог для проекта.

     mkdir basicapp
    
  2. Запустите команду npm init, чтобы инициализировать структуру пакета.

     cd basicapp
     npm init
    

    Для инициализации проекта команда npm init выводит ряд вопросов. Пример выходных данных приведен ниже.

    The npm init output

  3. Установите библиотеки express и azure-mobile-apps из репозитория npm.

     npm install --save express azure-mobile-apps
    
  4. Создайте файл app.js для реализации базового мобильного сервера.

    var express = require('express'),
        azureMobileApps = require('azure-mobile-apps');
    
    var app = express(),
        mobile = azureMobileApps();
    
    // Define a TodoItem table.
    mobile.tables.add('TodoItem');
    
    // Add the Mobile API so it is accessible as a Web API.
    app.use(mobile);
    
    // Start listening on HTTP.
    app.listen(process.env.PORT || 3000);
    

Это приложение создает веб-API, оптимизированный для мобильных устройств, с одной конечной точкой (/tables/TodoItem), которая с помощью динамической схемы предоставляет доступ к базовому хранилищу данных SQL без проверки подлинности. Этот пример подходит к следующим примерам использования клиентских библиотек:

Код этого базового приложения можно найти в примере basicapp на сайте GitHub.

Создание серверной части на основе Node.js с помощью Visual Studio 2015

Для разработки приложений на Node.js в рамках IDE с помощью Visual Studio 2015 требуется специальное расширение. Для начала установите Node.js Tools 1.1 для Visual Studio. После завершения установки создайте приложение Express 4.x.

  1. Откройте диалоговое окно Новый проект (последовательно выберите Файл>Создать>Проект).

  2. Разверните шаблоны>JavaScript>Node.js.

  3. Выберите Основное приложение Node.js Express 4 в Azure.

  4. Введите имя проекта. Щелкните ОК.

    Visual Studio 2015 new project

  5. Щелкните правой кнопкой мыши узел npm и выберите Установка новых пакетов npm.

  6. После создания первого приложения Node.js может потребоваться обновить каталог npm. При необходимости нажмите кнопку "Обновить ".

  7. В поле поиска введите azure-mobile-apps . Выберите пакет azure-mobile-apps 2.0.0, а затем — Install Package (Установить пакет).

    Install new npm packages

  8. Выберите Закрыть.

  9. Откройте файл app.js, чтобы добавить поддержку пакета SDK для функции "Мобильные приложения". В строке 6 в нижней части инструкций require библиотеки добавьте следующий код:

    var bodyParser = require('body-parser');
    var azureMobileApps = require('azure-mobile-apps');
    

    Примерно в строке 27 после других инструкций app.use добавьте следующий код:

    app.use('/users', users);
    
    // Mobile Apps initialization
    var mobile = azureMobileApps();
    mobile.tables.add('TodoItem');
    app.use(mobile);
    

    Сохраните файл.

  10. Запустите приложение локально (API обслуживается https://localhost:3000) или опубликуйте его в Azure.

Создание серверной части Node.js с помощью портала Azure

Серверную часть функции "Мобильные приложения" можно создать прямо на портале Azure. Для этого выполните описанные ниже действия либо инструкции из руководства Создание приложения iOS, где описано одновременное создание клиента и сервера. В этом руководстве представлена упрощенная версия этих инструкций, что лучше всего подходит для проектов, предназначенных для подтверждения концепции.

  1. Войдите на портал Azure.

  2. Выберите +СОЗДАТЬ>веб-приложение + мобильное>приложение, а затем укажите имя серверной части мобильных приложений.

  3. В поле Группа ресурсов выберите существующую группу ресурсов или создайте новую (с тем же именем, что и у приложения).

  4. В качестве плана службы приложений используется план по умолчанию (для уровня "Стандартный"). Вы также можете выбрать другой план или создать новый.

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

  5. Нажмите кнопку создания. На этом шаге создается серверная часть мобильных приложений.

  6. В области Параметры для новой серверной части мобильных приложений выберите быстрый запуск> платформы > клиентских приложений Подключение базе данных.

    Selections for connecting a database

  7. В области Добавить подключение данных выберите База данных SQL>Создать новую базу данных. Введите имя базы данных, укажите ценовую категорию и выберите Сервер. Эту новую базу данных можно использовать повторно. Если в этом регионе у вас уже есть база данных, вы можете выбрать пункт Использовать существующую базу данных. Из-за затрат на пропускную способность и более длительных задержек мы не рекомендуем использовать базу данных в другом расположении.

    Selecting a database

  8. В области Новый сервер введите уникальное имя сервера в соответствующее поле, укажите имя для входа и пароль, установите флажок Разрешить службам Azure доступ к серверу и нажмите кнопку ОК. Будет создана база данных.

  9. Вернитесь в область Добавить подключение к данным, щелкните Строка подключения, введите имя для входа и пароль для базы данных, а затем нажмите кнопку ОК.

    Прежде чем продолжать, подождите несколько минут, пока будет выполнено развертывание базы данных.

Вернитесь в область Get started (Начало работы) и в разделе Создание API таблицы в качестве языка серверной части выберите значение Node.js. Установите флажок Я понимаю, что это перезапишет все содержимое сайта и выберите Создание таблицы TodoItem.

Загрузка серверной части на основе Node.js в виде готового кода для быстрого запуска с помощью Git

Когда вы создаете серверную часть функции "Мобильные приложения" для Node.js с помощью области портала Быстрый запуск, для вас будет создан и развернут на сайте проект Node.js. На портале вы сможете добавлять таблицы и API-интерфейсы, а также изменять файлы кода серверной части Node.js. С помощью различных средств развертывания вы можете скачать проект серверной части, чтобы добавить или изменить таблицы и интерфейсы API, а затем повторно опубликовать этот проект. Дополнительные сведения см. в руководстве по развертыванию службы приложений Azure.

В следующей процедуре используется репозиторий Git для скачивания кода проекта быстрого запуска.

  1. Установите Git, если его у вас еще нет. Действия, необходимые для установки Git, отличаются в разных операционных системах. Сведения о дистрибутивах для разных операционных систем и руководство по установке см. в статье Getting Started - Installing Git (Начало работы. Установка Git).

  2. Чтобы включить репозиторий Git для сайта серверной части, ознакомьтесь с разделом Подготовка репозитория. Запишите имя пользователя и пароль для развертывания.

  3. В области для серверной части функции "Мобильные приложения" найдите параметр URL-адрес клона Git и запишите его.

  4. Выполните команду git clone, указав URL-адрес клона Git. Введите пароль в ответ на запрос, как показано в следующем примере.

     $ git clone https://username@todolist.scm.azurewebsites.net:443/todolist.git
    
  5. Перейдите в локальный каталог (в приведенном выше примере это /todolist) и убедитесь, что файлы проекта скачаны. Найдите файл todoitem.json в каталоге /tables. Этот файл определяет разрешения для таблицы. В том же каталоге найдите файл todoitem.js. Он определяет скрипты операций CRUD для таблицы.

  6. После внесения изменений в файлы проекта выполните следующие команды, чтобы добавить, зафиксировать и передать изменения на сайт:

     $ git commit -m "updated the table script"
     $ git push origin master
    

    При добавлении новых файлов в проект необходимо сначала выполнить команду git add ..

Каждый раз, когда на сайт помещается новый набор фиксаций, сайт повторно публикуется.

Публикация серверной части на основе Node.js в Azure

Microsoft Azure предоставляет множество механизмов публикации серверной части на платформе Node.js для функции "Мобильные приложения". К этим механизмам относятся средства развертывания, интегрированные в Visual Studio, программы командной строки и средства непрерывного развертывания на основе системы управления версиями. Дополнительные сведения см. в руководстве по развертыванию службы приложений Azure.

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

Включение домашней страницы для приложения

Многие приложения доступны в виде комбинации веб-приложений и мобильных приложений. Платформа ExpressJS позволяет комбинировать эти компоненты. Тем не менее иногда нужно реализовать только мобильный интерфейс. Это полезно, когда нужно создать домашнюю страницу, чтобы проверить работоспособность службы приложений. Можно указать свою домашнюю страницу или включить временную. Чтобы включить временную домашнюю страницу, используйте следующий код для создания экземпляра мобильных приложений.

var mobile = azureMobileApps({ homePage: true });

Если вам нужно использовать данную возможность только при локальной разработке, то этот параметр можно добавить в файл azureMobile.js.

Операции с таблицами

Серверный пакет SDK azure-mobile-apps для Node.js предоставляет механизмы доступа через веб-интерфейсы к таблицам, хранящимся в базе данных SQL Azure. Он предоставляет пять операций.

Операция Описание
GET /tables/имя_таблицы Получает все записи в таблице.
GET /tables/имя_таблицы/:id Получает определенную запись из таблицы.
POST /tables/имя_таблицы Создает запись в таблице.
PATCH /tables/имя_таблицы/:id Обновляет запись в таблице.
DELETE /tables/имя_таблицы/:id Удаляет запись из таблицы.

Этот веб-API поддерживает протокол OData и расширяет схему таблицы для поддержки автономной синхронизации данных.

Определение таблиц с помощью динамической схемы

Перед использованием таблицы ее необходимо определить. Таблицы можно определять с помощью статических схем (когда вы определяете столбцы в схеме) или динамических схем (когда схема определяется пакетом SDK в зависимости от поступающих запросов). Кроме того, вы можете управлять некоторыми деталями работы WebAPI путем добавления в определение кода на JavaScript.

Рекомендуется определять все таблицы в отдельных файлах JavaScript и размещать их в каталоге tables, а затем использовать метод tables.import(), чтобы импортировать таблицы. Расширим пример базового приложения, изменив файл app.js:

var express = require('express'),
    azureMobileApps = require('azure-mobile-apps');

var app = express(),
    mobile = azureMobileApps();

// Define the database schema that is exposed.
mobile.tables.import('./tables');

// Provide initialization of any tables that are statically defined.
mobile.tables.initialize().then(function () {
    // Add the Mobile API so it is accessible as a Web API.
    app.use(mobile);

    // Start listening on HTTP.
    app.listen(process.env.PORT || 3000);
});

Определение таблицы в файле ./tables/TodoItem.js:

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Additional configuration for the table goes here.

module.exports = table;

По умолчанию в таблицах используется динамическая схема. Чтобы глобально отключить динамическую схему, на портале Azure установите значение false для параметра приложения MS_DynamicSchema.

Полный пример можно найти в примере todo на GitHub.

Определение таблиц с помощью статической схемы

Вы можете явным образом определять столбцы, которые будут предоставляться через WebAPI. Пакет SDK для Node.js (azure-mobile-apps) автоматически добавляет к вашему списку дополнительные столбцы, необходимые для автономной синхронизации данных. Например, в примерах клиентских приложений требуется таблица с двумя столбцами: text (строка) и complete (логическое значение).
Эту таблицу можно указать в определении таблицы в файле JavaScript (расположен в каталоге tables) следующим образом.

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Define the columns within the table.
table.columns = {
    "text": "string",
    "complete": "boolean"
};

// Turn off the dynamic schema.
table.dynamicSchema = false;

module.exports = table;

Если таблица определяется статически, то вам потребуется вызвать метод tables.initialize(), чтобы создать схему базы данных при запуске приложения. Метод tables.initialize() возвращает объект promise, чтобы веб-служба не начинала обслуживать запросы до инициализации базы данных.

Использование SQL Server Express в качестве хранилища данных при разработке на локальном компьютере

Пакет SDK Node.js для функции "Мобильные приложения" предоставляет три стандартных варианта обслуживания данных:

  • драйвер memory удобен для создания временного хранилища примеров;
  • драйвер mssql с доступом к хранилищу данных SQL Server Express рекомендуется на этапе разработки;
  • драйвер mssql с доступом к хранению данныз в Базе данных SQL Azure рекомендуется для рабочей среды.

Пакет SDK Node.js для функции "Мобильные приложения" использует пакет mssql Node.js для создания и использования подключения к базам данных обоих типов: SQL Server Express и базе данных SQL. Для использования этого пакета необходимо включить TCP-подключения в вашем экземпляре SQL Server Express.

Совет

Драйвер memory не предоставляет полный набор средств для тестирования. Для тестирования серверной части в локальном режиме рекомендуется использовать базу данных SQL Server Express и драйвер mssql.

  1. Загрузите и установите Microsoft SQL Server 2014 Express. Убедитесь, что устанавливается выпуск SQL Server 2014 Express со средствами. Если вам явно не требуется 64-разрядная версия, воспользуйтесь 32-разрядной версией, которая потребляет меньше памяти во время выполнения.

  2. Запустите диспетчер конфигурации SQL Server 2014.

    а. Разверните узел Сетевая конфигурация SQL Server в дереве.

    b. Выберите Protocols for SQLEXPRESS (Протоколы для SQLEXPRESS).

    c. Щелкните правой кнопкой мыши TCP/IP и выберите Включить. Нажмите кнопку ОК во всплывающем диалоговом окне.

    Г. Щелкните правой кнопкой мыши TCP/IP и выберите Свойства.

    e. Откройте вкладку IP-адреса.

    е) Найдите узел IPAll . В поле TCP-порт введите 1433.

    Configure SQL Server Express for TCP/IP

    ж. Щелкните ОК. Нажмите кнопку ОК во всплывающем диалоговом окне.

    h. В дереве выберите Службы SQL Server.

    i. Щелкните правой кнопкой мыши SQL Server (SQLEXPRESS) и выберите "Перезапустить".

    j. Закройте диспетчер конфигурации SQL Server 2014.

  3. Запустите SQL Server 2014 Management Studio и подключитесь к локальному экземпляру SQL Server Express.

    1. Щелкните правой кнопкой мыши экземпляр SQL Express в обозревателе объектов и выберите Свойства.

    2. Перейдите на страницу Безопасность .

    3. Убедитесь, что выбран режим Проверка подлинности SQL Server и Windows.

    4. Щелкните ОК.

      Configure SQL Server Express authentication

    5. Развернитеимена входабезопасности> в обозреватель объектов.

    6. Щелкните правой кнопкой мыши "Имена входа" и выберите "Создать имя входа".

    7. Введите имя входа. Выберите параметр Проверка подлинности SQL Server. Введите пароль, а затем в поле Confirm password (Подтверждение пароля) введите его еще раз. Пароль должен соответствовать требованиям к сложности паролей, установленным в Windows.

    8. Щелкните ОК.

      Add a new user to SQL Server Express

    9. Щелкните правой кнопкой мыши новое имя для входа и выберите Свойства

    10. Перейдите на страницу Роли сервера.

    11. Установите флажок рядом с ролью сервера dbcreator.

    12. Щелкните ОК.

    13. Закройте SQL Server 2015 Management Studio.

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

Для получения строки подключения к этой базе данных приложение Node.js обращается к переменной среды SQLCONNSTR_MS_TableConnectionString. Значение этой переменной можно задать непосредственно в своей среде. Например, чтобы присвоить этой переменной значение, вы можете воспользоваться следующей командой PowerShell:

$env:SQLCONNSTR_MS_TableConnectionString = "Server=127.0.0.1; Database=mytestdatabase; User Id=azuremobile; Password=T3stPa55word;"

Доступ к базе данных осуществляется через подключение TCP/IP. Для этого подключения требуется указать имя пользователя и пароль.

Настройка проекта для локальной разработки

Мобильные приложения считывают файл JavaScript с именем azureMobile.js из локальной файловой системы. В рабочей среде не следует использовать этот файл для настройки пакета SDK для функции "Мобильные приложения". Вместо этого используйте параметры приложения в портал Azure.

Файл azureMobile.js должен экспортировать объект конфигурации. Ниже перечислены основные параметры.

  • Параметры базы данных
  • Параметры журнала ведения диагностики.
  • Дополнительные параметры CORS.

Этот пример файла azureMobile.js реализует указанные выше параметры базы данных.

module.exports = {
    cors: {
        origins: [ 'localhost' ]
    },
    data: {
        provider: 'mssql',
        server: '127.0.0.1',
        database: 'mytestdatabase',
        user: 'azuremobile',
        password: 'T3stPa55word'
    },
    logging: {
        level: 'verbose'
    }
};

Мы рекомендуем добавить azureMobile.js в GITIGNORE-файл (или в другой файл игнорирования для системы управления исходным кодом), чтобы не допустить сохранения паролей в облаке. Параметры рабочей версии всегда следует настраивать в разделе параметров приложений на портале Azure.

Настройка параметров для мобильного приложения

Для большинства параметров в файле azureMobile.js имеется эквивалентный параметр приложения на портале Azure. Используйте следующий список, чтобы настроить свое приложение в параметрах приложения:

Параметр приложения Параметр azureMobile.js Описание Допустимые значения
MS_MobileAppName name Имя приложения строка
MS_MobileLoggingLevel logging.level Минимальный уровень ведения журнала для регистрируемых сообщений error, warning, info, verbose, debug, silly
MS_DebugMode debug Включает или отключает режим отладки true, false
MS_TableSchema data.schema Имя схемы по умолчанию для таблиц SQL строка (значение по умолчанию: dbo)
MS_DynamicSchema data.dynamicSchema Включает или отключает режим отладки true, false
MS_DisableVersionHeader version (задано значение undefined) Отключение заголовка X-ZUMO-Server-Version true, false
MS_SkipVersionCheck skipversioncheck Отключение проверки версии API клиента true, false

Порядок задания параметра приложения:

  1. Войдите на портал Azure.
  2. Выберите Все ресурсы или Службы приложений, а затем выберите имя своего мобильного приложения.
  3. По умолчанию откроется область Параметры. В противном случае выберите Параметры.
  4. В меню Общие выберите Параметры приложения.
  5. Прокрутите страницу до раздела параметров приложения .
  6. Если параметр приложения уже существует, выберите значение этого параметра, чтобы изменить его. Если параметр приложения не существует, введите параметр в поле Ключ и значение в поле Значение.
  7. Щелкните Сохранить.

Для большинства параметров после внесения изменений потребуется перезапустить службу.

Использование базы данных SQL для хранения данных в рабочей среде

Порядок использования Базы данных SQL в качестве хранилища данных идентичен для всех типов приложений службы приложений Azure. Если вы этого еще не сделали, создайте серверную часть функции "Мобильные приложения", выполнив указанные ниже действия.

  1. Войдите на портал Azure.

  2. В левом верхнем углу окна нажмите кнопку +NEW button >Web + Mobile>App, а затем введите имя серверной части мобильных приложений.

  3. В окне Группа ресурсов введите имя своего приложения.

  4. Будет выбран план службы приложений по умолчанию. Если вы хотите изменить план службы приложений, сделайте следующее:

    а. Выберите Служба приложений Plan+Create New (Создать>).

    b. Введите имя нового плана службы приложений и выберите подходящее расположение.

    c. Выберите соответствующую ценовую категорию для службы. Щелкните Просмотреть все, чтобы просмотреть другие варианты тарификации, например Бесплатный и Общий.

    Г. Нажмите кнопку Выбрать.

    e. В области План службы приложений нажмите кнопку ОК.

  5. Нажмите кнопку создания.

Подготовка серверной части функции "Мобильные приложения" может занять несколько минут. Когда серверная часть функции "Мобильные приложения" будет подготовлена, на портале для нее откроется область Параметры.

Вы можете подключить ее к имеющейся базе данных SQL либо создать другую базу данных SQL. В этом разделе мы создадим базу данных SQL.

Примечание

Если у вас уже есть база данных в том же расположении, что и серверная часть функции "Мобильные приложения", то вы можете выбрать эту базу данных, щелкнув Использовать существующую базу данных. Ввиду более длительных задержек не рекомендуется использовать базу данных в другом расположении.

  1. В новой серверной части мобильных приложений выберите Параметры>Mobile App>Data>+Add.

  2. В области Добавить подключение данных выберите База данных SQL — Настройка обязательных параметров>Создать новую базу данных. Введите имя новой базы данных в поле Имя.

  3. Выберите "Сервер". В области Новый сервер введите уникальное имя сервера в поле Имя сервера и укажите подходящие имя администратора сервера и пароль. Убедитесь, что установлен флажок Разрешить службам Azure доступ к серверу. Щелкните ОК.

    Create an Azure SQL database

  4. В области Новая база данных нажмите кнопку ОК.

  5. В области Добавить подключение к данным выберите Строка подключения и введите имя и пароль, указанные при создании базы данных. При использовании существующей базы данных укажите соответствующие учетные данные для входа. Щелкните ОК.

  6. В области Добавить подключение к данным нажмите кнопку ОК, чтобы создать базу данных.

Создание базы данных может занять несколько минут. Используйте область Уведомления , чтобы отслеживать ход выполнения развертывания. Не выполняйте дальнейших действий, пока база данных не будет успешно развернута. После завершения развертывания базы данных в настройки серверной части функции "Мобильные приложения" будет добавлена строка подключения к экземпляру базы данных SQL Azure. Этот параметр приложения отображается встроках> подключения Параметры>Application.

Обязательная проверка подлинности для доступа к таблицам

Если вы хотите использовать проверку подлинности Служба приложений с конечной tables точкой, сначала необходимо настроить проверку подлинности Служба приложений в портал Azure. Дополнительные сведения см. в приведенном ниже руководстве по настройке соответствующего поставщика удостоверений.

В каждой таблице имеется свойство доступа (access), которое можно использовать для контроля доступа к таблице. В следующем примере показана статически определенная таблица с обязательной проверкой подлинности.

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Define the columns within the table.
table.columns = {
    "text": "string",
    "complete": "boolean"
};

// Turn off the dynamic schema.
table.dynamicSchema = false;

// Require authentication to access the table.
table.access = 'authenticated';

module.exports = table;

Свойство access может принимать одно из трех значений:

  • anonymous указывает, что клиентское приложение может считывать данные без проверки подлинности;
  • authenticated указывает, что клиентское приложение вместе с запросом должно отправлять действительный токен проверки подлинности;
  • disabled указывает, что эта таблица сейчас отключена.

Если свойство доступа нельзя определить, будет разрешен доступ без проверки подлинности.

Использование утверждений проверки подлинности для таблиц

Можно настроить различные утверждения, запрашиваемые при настройке аутентификации. Обычно эти утверждения недоступны через объект context.user . Тем не менее их можно извлечь с помощью метода context.user.getIdentity(). Метод getIdentity() возвращает обещание, которое разрешается в объект. Объект помечается ключом метода проверки подлинности (facebook, google, twitter, microsoftaccount или aad).

Например, если вы настраиваете проверку подлинности учетных записей Майкрософт и запрашиваете утверждение электронного адреса, то можете добавить электронный адрес в запись с помощью следующего контроллера таблиц.

var azureMobileApps = require('azure-mobile-apps');

// Create a new table definition.
var table = azureMobileApps.table();

table.columns = {
    "emailAddress": "string",
    "text": "string",
    "complete": "boolean"
};
table.dynamicSchema = false;
table.access = 'authenticated';

/**
* Limit the context query to those records with the authenticated user email address
* @param {Context} context the operation context
* @returns {Promise} context execution Promise
*/
function queryContextForEmail(context) {
    return context.user.getIdentity().then((data) => {
        context.query.where({ emailAddress: data.microsoftaccount.claims.emailaddress });
        return context.execute();
    });
}

/**
* Adds the email address from the claims to the context item - used for
* insert operations
* @param {Context} context the operation context
* @returns {Promise} context execution Promise
*/
function addEmailToContext(context) {
    return context.user.getIdentity().then((data) => {
        context.item.emailAddress = data.microsoftaccount.claims.emailaddress;
        return context.execute();
    });
}

// Configure specific code when the client does a request.
// READ: only return records that belong to the authenticated user.
table.read(queryContextForEmail);

// CREATE: add or overwrite the userId based on the authenticated user.
table.insert(addEmailToContext);

// UPDATE: only allow updating of records that belong to the authenticated user.
table.update(queryContextForEmail);

// DELETE: only allow deletion of records that belong to the authenticated user.
table.delete(queryContextForEmail);

module.exports = table;

Чтобы узнать, какие утверждения доступны, используйте веб-браузер для просмотра конечной точки /.auth/me своего сайта.

Запрет доступа к определенным операциям с таблицей

Свойство доступа может относиться не только к таблице в целом, но и к отдельным операциям. Существует четыре операции:

  • read — REST-запрос GET для таблицы;
  • insert — REST-запрос POST для таблицы;
  • update — REST-запрос PATCH для таблицы;
  • delete — REST-запрос DELETE для таблицы.

Например, вы хотите создать таблицу с доступом только для чтения без проверки подлинности.

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Read-only table. Only allow READ operations.
table.read.access = 'anonymous';
table.insert.access = 'disabled';
table.update.access = 'disabled';
table.delete.access = 'disabled';

module.exports = table;

Изменение запроса, используемого в операциях с таблицей

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

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Define a static schema for the table.
table.columns = {
    "userId": "string",
    "text": "string",
    "complete": "boolean"
};
table.dynamicSchema = false;

// Require authentication for this table.
table.access = 'authenticated';

// Ensure that only records for the authenticated user are retrieved.
table.read(function (context) {
    context.query.where({ userId: context.user.id });
    return context.execute();
});

// When adding records, add or overwrite the userId with the authenticated user.
table.insert(function (context) {
    context.item.userId = context.user.id;
    return context.execute();
});

module.exports = table;

Операции, которые подразумевают выполнение запроса, содержат свойство query, которое можно изменить с помощью предложения where. Свойство query представляет собой объект QueryJS, используемый для преобразования запроса OData в то, что может быть обработано серверной частью. В простых операциях сравнения (как в примере выше) можно использовать карту. Можно также добавить определенные предложения SQL.

context.query.where('myfield eq ?', 'value');

Настройка обратимого удаления для таблицы

При обратимом удалении записи фактически не удаляются. Вместо этого они помечаются как удаленные установкой значения true в столбце deleted. Пакет SDK для функции "Мобильные приложения" автоматически удаляет записи, помеченные как удаленные, из результатов запроса, если только в методе не используется конструкция IncludeDeleted(). Чтобы настроить обратимое удаление из таблицы, настройте свойство softDelete в файле определения таблицы.

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Define the columns within the table.
table.columns = {
    "text": "string",
    "complete": "boolean"
};

// Turn off the dynamic schema.
table.dynamicSchema = false;

// Turn on soft delete.
table.softDelete = true;

// Require authentication to access the table.
table.access = 'authenticated';

module.exports = table;

Следует создать механизм удаления записей: посредством клиентского приложения, веб-заданий, функции Azure или пользовательского API.

Заполнение базы данных данными

При создании приложения вам может потребоваться заполнить таблицу данными. Это можно сделать в файле JavaScript определения таблицы:

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Define the columns within the table.
table.columns = {
    "text": "string",
    "complete": "boolean"
};
table.seed = [
    { text: 'Example 1', complete: false },
    { text: 'Example 2', complete: true }
];

// Turn off the dynamic schema.
table.dynamicSchema = false;

// Require authentication to access the table.
table.access = 'authenticated';

module.exports = table;

Заполнение данными выполняется только при создании таблицы с помощью пакета SDK для функции "Мобильные приложения". Если таблица уже существует в базе данных, данные не добавляются. Если включено использование динамической схемы, схема будет определена на основании добавляемых данных.

Чтобы создать таблицу при запуске службы, рекомендуется явно вызывать метод tables.initialize().

Включение поддержки Swagger

Мобильные приложения предоставляются со встроенной поддержкой Swagger. Чтобы включить поддержку Swagger, сначала необходимо установить пользовательский интерфейс Swagger в качестве зависимости:

npm install --save swagger-ui

Затем можно включить поддержку Swagger в конструкторе мобильных приложений:

var mobile = azureMobileApps({ swagger: true });

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

var mobile = azureMobileApps({ swagger: process.env.NODE_ENV !== 'production' });

Конечная точка swagger находится по адресу http://ваш_сайт.azurewebsites.net/swagger. Доступ к пользовательскому интерфейсу Swagger можно получить с помощью конечной точки /swagger/ui . Swagger вернет ошибку для конечной точки, если настроить обязательную проверку подлинности для всего приложения. Чтобы достичь наилучших результатов, разрешите получать запросы без проверки подлинности в параметрах проверки подлинности и авторизации в службе приложений Azure, а затем управляйте проверкой подлинности с помощью свойства table.access.

Кроме того, вы можете добавить параметр Swagger в файл azureMobile.js, если поддержка Swagger требуется только при локальной разработке.

Push-уведомления

Мобильные приложения интегрируются с концентраторами уведомлений Azure, поэтому вы можете отправлять целевые push-уведомления на миллионы устройств в рамках всех основных платформ. С помощью Центров уведомлений можно отправлять push-уведомления на устройства iOS, Android и Windows. Дополнительные сведения обо всем, что можно сделать с помощью концентраторов уведомлений, см. в обзоре Центров уведомлений.

отправка push-уведомлений.

В коде ниже показано, как использовать объект push для отправки широковещательных push-уведомлений на зарегистрированные устройства iOS.

// Create an APNS payload.
var payload = '{"aps": {"alert": "This is an APNS payload."}}';

// Only do the push if configured.
if (context.push) {
    // Send a push notification by using APNS.
    context.push.apns.send(null, payload, function (error) {
        if (error) {
            // Do something or log the error.
        }
    });
}

Создав шаблонную регистрацию push-уведомлений с клиента, можно отправлять шаблонные push-сообщения на устройства на всех поддерживаемых платформах. В коде ниже показано, как отправить шаблонное уведомление.

// Define the template payload.
var payload = '{"messageParam": "This is a template payload."}';

// Only do the push if configured.
if (context.push) {
    // Send a template notification.
    context.push.send(null, payload, function (error) {
        if (error) {
            // Do something or log the error.
        }
    });
}

Отправка push-уведомлений прошедшему проверку подлинности пользователю с помощью тегов

Когда прошедший проверку пользователь регистрируется для работы с push-уведомлениями, в регистрацию автоматически добавляется тег с идентификатором пользователя. С помощью этого тега можно отправлять push-уведомления на все устройства, зарегистрированные конкретным пользователем. Следующий код получает идентификатор SID пользователя, выполняющего запрос, и отправляет шаблонное push-уведомление в каждую регистрацию устройства для этого пользователя:

// Only do the push if configured.
if (context.push) {
    // Send a notification to the current user.
    context.push.send(context.user.id, payload, function (error) {
        if (error) {
            // Do something or log the error.
        }
    });
}

При регистрации для работы с push-уведомлениями на клиенте, прошедшем проверку подлинности, убедитесь, что проверка подлинности завершена, и только после этого начинайте регистрацию.

Настраиваемые API

Определение настраиваемого интерфейса API

Помимо API доступа к данным через конечную точку /tables, функция "Мобильные приложения" может предоставлять настраиваемые службы API. Настраиваемые службы API определяются так же, как и таблицы, и могут использовать тот же набор возможностей, включая проверку подлинности.

Если вы хотите использовать проверку подлинности службы приложений для настраиваемого API, сначала нужно настроить проверку подлинности службы приложений на портале Azure. Дополнительные сведения см. в приведенном ниже руководстве по настройке соответствующего поставщика удостоверений.

Определение настраиваемых API схоже с определением API таблиц.

  1. Создайте каталог api.
  2. В каталоге api создайте файл JavaScript с определением API.
  3. Вызовите метод import, чтобы импортировать каталог api.

Вот прототип определения API для использованного выше примера basic-app.

var express = require('express'),
    azureMobileApps = require('azure-mobile-apps');

var app = express(),
    mobile = azureMobileApps();

// Import the custom API.
mobile.api.import('./api');

// Add the Mobile API so it is accessible as a Web API.
app.use(mobile);

// Start listening on HTTP
app.listen(process.env.PORT || 3000);

Рассмотрим пример API, который возвращает дату сервера с помощью метода Date.now(). Ниже приведено содержимое файла api/date.js:

var api = {
    get: function (req, res, next) {
        var date = { currentTime: Date.now() };
        res.status(200).type('application/json').send(date);
    });
};

module.exports = api;

Каждый параметр соответствует стандартной команде RESTful: GET, POST, PATCH или DELETE. Этот метод является стандартной функцией промежуточного слоя ExpressJS, которая отправляет требуемые выходные данные.

Обязательная проверка подлинности для доступа к настраиваемому API

Пакет SDK для функции "Мобильные приложения" реализует проверку подлинности точно так же, как конечные точки tables и настраиваемые службы API. Чтобы добавить проверку подлинности к API-интерфейсу, который мы создали в предыдущем разделе, добавьте свойство access:

var api = {
    get: function (req, res, next) {
        var date = { currentTime: Date.now() };
        res.status(200).type('application/json').send(date);
    });
};
// All methods must be authenticated.
api.access = 'authenticated';

module.exports = api;

Также можно определить проверку подлинности для конкретных операций:

var api = {
    get: function (req, res, next) {
        var date = { currentTime: Date.now() };
        res.status(200).type('application/json').send(date);
    }
};
// The GET methods must be authenticated.
api.get.access = 'authenticated';

module.exports = api;

Для настраиваемых служб API, требующих проверки подлинности, необходимо использовать тот же маркер, что и для конечных точек tables.

Обработка передачи больших файлов

Пакет SDK для функции "Мобильные приложения" использует ПО промежуточного слоя средства синтаксического анализа текста для приема и расшифровки содержимого текста в отправляемых данных. Анализатор текста запроса можно предварительно настроить для приема отправки больших файлов:

var express = require('express'),
    bodyParser = require('body-parser'),
    azureMobileApps = require('azure-mobile-apps');

var app = express(),
    mobile = azureMobileApps();

// Set up large body content handling.
app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({ limit: '50mb', extended: true }));

// Import the custom API.
mobile.api.import('./api');

// Add the Mobile API so it is accessible as a Web API.
app.use(mobile);

// Start listening on HTTP.
app.listen(process.env.PORT || 3000);

Перед передачей файл кодируется в Base-64. Это кодирование увеличивает размер передаваемых данных, что нужно учесть.

Выполнение пользовательских инструкций SQL

Пакет SDK для функции "Мобильные приложения" предоставляет доступ ко всему контексту через объект запроса. Вы можете легко выполнять параметризованные инструкции SQL для определенного поставщика данных:

var api = {
    get: function (request, response, next) {
        // Check for parameters. If not there, pass on to a later API call.
        if (typeof request.params.completed === 'undefined')
            return next();

        // Define the query. Anything that the mssql
        // driver can handle is allowed.
        var query = {
            sql: 'UPDATE TodoItem SET complete=@completed',
            parameters: [{
                completed: request.params.completed
            }]
        };

        // Execute the query. The context for Mobile Apps is available through
        // request.azureMobile. The data object contains the configured data provider.
        request.azureMobile.data.execute(query)
        .then(function (results) {
            response.json(results);
        });
    }
};

api.get.access = 'authenticated';
module.exports = api;

Отладка

Отладка, диагностика и устранение неполадок функции "Мобильные приложения"

Служба приложений Azure предоставляет несколько методов отладки и устранения неполадок в приложениях на Node.js. Чтобы приступить к устранению неполадок серверной части функции "Мобильные приложения" на Node.js, ознакомьтесь со следующими статьями:

Приложениям на Node.js предоставляется доступ к различным средствам работы с журналами диагностики. Для ведения журнала диагностики пакет SDK на Node.js для функции "Мобильные приложения" использует Winston. Ведение журнала автоматически включено при включении режима отладки или установке MS_DebugMode параметра приложения на значение true в портал Azure. Созданные журналы отображаются в журналах диагностики в портал Azure.