如何使用移动应用 Node.js SDK

本文提供了详细的信息和示例,演示如何在 Azure 应用服务的移动应用功能中使用 Node.js 后端。

介绍

移动应用提供向 Web 应用程序添加移动优化的数据访问 Web API 的功能。 移动应用 SDK 用于 ASP.NET 和 Node.js Web 应用程序。 SDK 提供以下操作:

  • 用于数据访问的表操作(读取、插入、更新、删除)
  • 自定义 API 操作

这两项操作都提供 Azure 应用服务允许的所有标识提供者的身份验证。 这些提供程序包括 Facebook、Twitter、Google 和 Microsoft 等社交标识提供者,以及用于企业标识的 Azure Active Directory。

可以在 GitHub 上的示例目录中查找每个用例的示例。

支持的平台

移动应用 Node.js SDK 支持 Node 和更高版本的当前 LTS 版本。 目前,最新的 LTS 版本是 Node v4.5.0。 其他版本的 Node 可能正常工作,但不受支持。

移动应用 Node.js SDK 支持两个数据库驱动程序:

  • node-mssql 驱动程序支持 Azure SQL 数据库和本地 SQL Server 实例。
  • sqlite3 驱动程序仅支持单个实例上的 SQLite 数据库。

使用命令行创建基本 Node.js 后端

每个移动应用 Node.js 后端都以 ExpressJS 应用程序的形式启动。 ExpressJS 是可用于 Node.js的最常用 Web 服务框架。 可以按如下所示创建基本 Express 应用程序:

  1. 在命令或 PowerShell 窗口中,为项目创建目录:

     mkdir basicapp
    
  2. 运行 npm init 以初始化包结构:

     cd basicapp
     npm init
    

    npm init 命令会询问一组初始化项目的问题。 请参阅示例输出:

    npm init 的输出

  3. 从 npm 存储库安装 expressazure-mobile-apps 库:

     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);
    

此应用程序创建具有单个终结点(/tables/TodoItem)的移动优化 Web API,该终结点使用动态架构提供对基础 SQL 数据存储的未经身份验证的访问。 它适合用于学习客户端库的快速入门指南。

可以在 GitHub 上的basicapp 示例中找到此基本应用程序的代码。

使用 Visual Studio 2015 创建 Node.js 后端

Visual Studio 2015 需要扩展才能在 IDE 中开发 Node.js 应用程序。 若要开始,请安装适用于 Visual Studio Node.js Tools 1.1。 完成安装后,创建 Express 4.x 应用程序:

  1. 打开 新建项目 对话框(从 文件>新建>项目)。

  2. 展开 模板>JavaScript>Node.js

  3. 选择 基本 Azure Node.js Express 4 应用程序

  4. 填写项目名称。 选择“确定”

    Visual Studio 2015 新项目

  5. 右键单击 npm 节点,然后选择 安装新的 npm 包。

  6. 创建第一个 Node.js 应用程序后,可能需要刷新 npm 目录。 如有必要,请选择 刷新

  7. 在搜索框中输入 azure-mobile-apps。 选择 azure-mobile-apps 2.0.0 包,然后选择 安装包

    安装新的 npm 包

  8. 选择 关闭

  9. 打开 app.js 文件,添加对移动应用 SDK 的支持。 在库底部的第 6 行 require 语句处,添加以下代码:

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

    在其他 app.use 语句之后大约第 27 行,添加以下代码:

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

    保存文件。

  10. 在本地运行应用程序(https://localhost:3000上提供 API),或发布到 Azure。

使用 Azure 门户创建 Node.js 后端

可以直接在 Azure 门户创建移动应用后端。 可以按照 创建移动应用 教程完成以下步骤或共同创建客户端和服务器。 本教程包含这些说明的简化版本,最适合用于概念证明项目。

  1. Azure 门户登录。

  2. 选择“+NEW>Web + 移动>移动应用”,然后为你的移动应用后端提供一个名称。

  3. 对于 资源组,请选择现有资源组,或创建新的资源组(使用与应用同名)。

  4. 对于 应用服务计划,选择默认计划(标准层)。 还可以选择其他计划,或 创建新的计划

    应用服务计划的设置确定与应用关联的 位置、功能、成本和计算资源。 有关应用服务计划以及如何在不同的定价层和所需位置创建新计划的详细信息,请参阅 Azure 应用服务计划深入概述

  5. 选择 创建。 此步骤创建移动应用后端。

  6. 在新的移动应用后端的“设置” 窗格中,选择“快速入门> 客户端应用平台 >连接数据库

    用于连接数据库的选择

  7. 在“添加数据连接 窗格中,选择 SQL 数据库>创建新的数据库。 输入数据库名称,选择定价层,然后选择 服务器。 可以重复使用此新数据库。 如果已有同一位置的数据库,则可以选择 使用现有数据库。 由于带宽成本和延迟较高,不建议在不同的位置使用数据库。

    选择数据库

  8. “新建服务器”窗格中,在 服务器名称 框中输入唯一的服务器名称,提供登录名和密码,选择“允许 Azure 服务访问服务器,然后选择 确定。 此步骤将创建新数据库。

  9. 返回到“添加数据连接”窗格,选择“连接字符串”,输入您的数据库的登录名和密码,然后选择“确定”。

    请等待几分钟,让数据库成功部署,然后再继续。

返回 开始 窗格,在 “创建表 API”下,选择 Node.js 作为后端语言。 选中 的框,确认这将覆盖的所有网站内容,然后选择 创建 TodoItem 表

使用 Git 下载 Node.js 后端快速入门代码项目

使用门户的 快速入门 窗格创建 Node.js 移动应用后端时,会为你创建一个 Node.js 项目并将其部署到站点。 在门户中,可以添加表和 API,并编辑 Node.js 后端的代码文件。 还可以使用各种部署工具下载后端项目,以便添加或修改表和 API,然后重新发布项目。 有关详细信息,请参阅 Azure 应用服务部署指南

以下过程使用 Git 存储库下载快速入门项目代码:

  1. 安装 Git(如果尚未安装)。 安装 Git 所需的步骤因作系统而异。 有关操作系统特定发行版和安装指南,请参阅 安装 Git

  2. 请参阅 准备你的存储库 以启用后端站点的 Git 存储库。 记下部署用户名和密码。

  3. 在移动应用后端的面板中,记下 Git 克隆 URL 设置。

  4. 使用 Git 克隆 URL 执行 git clone 命令。 根据需要输入密码,如以下示例所示:

     $ git clone https://username@todolist.scm.azurewebsites.net:443/todolist.git
    
  5. 浏览到本地目录(在前面的示例中/todolist),并注意到已下载项目文件。 在 /tables 目录中找到 todoitem.json 文件。 此文件定义对表的权限。 另请在同一目录中查找 todoitem.js 文件。 它定义了表的CRUD操作脚本。

  6. 对项目文件进行更改后,运行以下命令以添加、提交,然后将更改上传到网站:

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

    向项目添加新文件时,首先需要运行 git add . 命令。

每次将新的提交集推送到站点时,站点将被重新发布。

将 Node.js 后端发布到 Azure

Microsoft Azure 提供了许多机制,用于将移动应用 Node.js 后端发布到 Azure 服务。 这些机制包括集成到 Visual Studio 中的部署工具、命令行工具和基于源代码管理的持续部署选项。 有关详细信息,请参阅 Azure 应用服务部署指南

Azure 应用服务针对在发布后端之前应查看的 Node.js 应用程序提供具体建议:

为应用程序启用主页

许多应用程序是 Web 和移动应用的组合。 可以使用 ExpressJS 框架合并这两个方面。 但是,有时你可能只想实现移动接口。 提供一个主页以确保应用服务正常启动并运行是很有帮助的。 可以提供自己的主页,也可以启用临时主页。 若要启用临时主页,请使用以下代码实例化移动应用:

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

如果只想在本地开发时提供此选项,则可以将此设置添加到 azureMobile.js 文件。

数据表操作

azure-mobile-apps Node.js Server SDK 提供了一种机制,用于将存储在 Azure SQL 数据库中的数据表公开为 Web API。 它提供五个操作:

操作 说明
GET /tables/tablename 获取数据表中的所有记录。
GET /tables/tablename/:id 获取表中的特定记录。
POST /tables/tablename 在表中创建记录。
PATCH /tables/tablename/:id 更新表中的记录。
DELETE /tables/tablename/:id 删除表中的记录。

此 Web API 支持 OData,并扩展表架构以支持 脱机数据同步

使用动态架构定义表

您必须先定义一个表,然后才能使用它。 可以使用静态架构(在其中定义架构中的列)或动态(SDK 基于传入请求控制架构)来定义表。 此外,还可以通过将 JavaScript 代码添加到定义来控制 Web API 的特定方面。

最佳做法是,应在 tables 目录中的 JavaScript 文件中定义每个表,然后使用 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 门户中 MS_DynamicSchema 应用设置设置为 false。

可以在 GitHub 上的待办事项示例中找到完整示例。

使用静态架构定义表

可以显式定义要通过 Web API 公开的列。 azure-mobile-apps Node.js SDK 会自动将脱机数据同步所需的任何额外列添加到所提供的列表中。 例如,快速入门客户端应用程序需要一个包含两列的表: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() 方法返回一个 承诺,以便 Web 服务在初始化数据库之前不处理请求。

在本地计算机上使用 SQL Server Express 作为开发数据存储

移动应用 Node.js SDK 提供三个现成选项用于提供数据:

  • 使用 内存 驱动程序提供非持久性示例存储。
  • 使用 mssql 驱动程序提供用于开发的 SQL Server Express 数据存储。
  • 使用 mssql 驱动程序为生产提供 Azure SQL 数据库数据存储。

移动应用 Node.js SDK 使用 mssql Node.js 包 建立和使用与 SQL Server Express 和 SQL 数据库的连接。 此包要求在 SQL Server Express 实例上启用 TCP 连接。

小提示

内存驱动程序不提供一组完整的测试设施。 如果要在本地测试后端,建议使用 SQL Server Express 数据存储和 mssql 驱动程序。

  1. 下载并安装 Microsoft SQL Server 2014 Express。 确保安装 SQL Server 2014 Express with Tools 版本。 除非显式需要 64 位支持,否则 32 位版本在运行时消耗更少的内存。

  2. 运行 SQL Server 2014 Configuration Manager:

    a。 展开树菜单中 SQL Server 网络配置 节点。

    b. 选择 SQLEXPRESS 协议。

    c. 右键单击 TCP/IP,然后选择“启用 。 在弹出对话框中选择“确定”

    d. 右键单击 TCP/IP 并选择 属性

    e。 选择 IP 地址 选项卡。

    f. 查找 IPAll 节点。 在 TCP 端口 字段中,输入 1433

    为 TCP/IP 配置 SQL Server Express

    g. 选择“确定”。 在弹出对话框中选择“确定”

    h. 在树菜单中选择 SQL Server Services

    一. 右键单击 SQL Server(SQLEXPRESS) 并选择 重启

    j. 关闭 SQL Server 2014 Configuration Manager。

  3. 运行 SQL Server 2014 Management Studio 并连接到本地 SQL Server Express 实例:

    1. 在对象资源管理器中右键单击实例,然后选择 属性

    2. 选择 “安全性” 页。

    3. 确保选中 SQL Server 和 Windows 身份验证模式

    4. 选择“确定”

      配置 SQL Server Express 身份验证

    5. 在对象资源管理器中展开 安全>登录项

    6. 右键单击 登录名 并选择“新建登录名”

    7. 输入登录名。 选择“SQL Server 身份验证”。 输入密码,然后在 确认密码中输入相同的密码。 密码必须满足 Windows 复杂性要求。

    8. 选择“确定”

      将新用户添加到 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 连接访问数据库。 提供连接的用户名和密码。

配置项目以便进行本地开发

移动应用从本地文件系统读取名为 azureMobile.js 的 JavaScript 文件。 请勿使用此文件在生产环境中配置移动应用 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 姓名 应用的名称 字符串
MS_MobileLoggingLevel(移动日志记录级别) 日志级别 要记录的消息的最低日志级别 错误,警告,信息,详细,调试,低级
MS_DebugMode 调试 启用或禁用调试模式 真、假
MS_TableSchema 数据.模式 or data.schema SQL 表的默认架构名称 string (默认值:dbo)
MS_DynamicSchema 数据动态架构 启用或禁用调试模式 真、假
MS_DisableVersionHeader 版本(设置为未定义) 禁用 X-ZUMO-Server-Version 标头 真、假
MS_SkipVersionCheck skipversioncheck 禁用客户端 API 版本检查 真、假

要配置应用程序设置:

  1. 登录到 Azure 门户
  2. 选择 所有资源应用服务,然后选择移动应用的名称。
  3. 默认情况下,“设置”窗格将打开“ 窗格”。 如果没有,请选择设置
  4. 常规 菜单上,选择 应用程序设置
  5. 滚动到 应用设置 部分。
  6. 如果应用设置已存在,请选择应用设置的值以编辑该值。 如果应用设置不存在,请在“密钥”框中输入应用设置,并在“”框中输入值。
  7. 选择 保存

更改大多数应用设置需要重启服务。

使用 SQL 数据库作为生产数据存储

将 Azure SQL 数据库用作数据存储在所有 Azure 应用服务应用程序类型中都是相同的。 如果尚未这样做,请按照以下步骤创建移动应用后端:

  1. 登录到 Azure 门户

  2. 在窗口左上角,选择 +NEW 按钮,>Web + 移动>移动应用,然后提供移动应用后端的名称。

  3. 资源组 框中,输入与应用相同的名称。

  4. 已选择默认应用服务计划。 如果要更改应用服务计划:

    a。 选择 应用服务计划>+创建新

    b. 提供新的应用服务计划的名称,并选择适当的位置。

    c. 为服务选择适当的定价层。 选择 查看所有 以查看更多定价选项,例如 免费共享

    d. 单击“选择”按钮。

    e。 返回 应用服务计划 窗格中,点击 确定

  5. 选择 创建

预配移动应用后端可能需要几分钟时间。 预配移动应用后端后,门户将打开移动应用后端的 设置 窗格。

可以选择将现有 SQL 数据库连接到移动应用后端,或创建新的 SQL 数据库。 在本部分中,我们将创建一个 SQL 数据库。

注释

如果数据库与移动应用后端位于同一位置,则可以改为选择 使用现有数据库,然后选择该数据库。 由于延迟较高,不建议在不同的位置使用数据库。

  1. 在新移动应用后端中,选择“设置”>移动应用>数据>+添加

  2. 在“添加数据连接 窗格中,选择 SQL 数据库 - 配置所需的设置,>创建新数据库。 在 名称 框中输入新数据库的名称。

  3. 选择“服务器”。“新建服务器”窗格中,在“服务器名称” 框中输入唯一的服务器名称,并提供合适的服务器管理员登录名和密码。 确保选中 允许 Azure 服务访问服务器。 选择“确定”

    创建 Azure SQL 数据库

  4. “新建数据库”窗格中,选择“确定”

  5. 返回 “添加数据连接”窗格,选择 连接字符串,然后输入创建数据库时提供的登录名和密码。 如果使用现有数据库,请提供该数据库的登录凭据。 选择“确定”

  6. 返回到“添加数据连接”窗格,再次选择“确定”以创建数据库。

创建数据库可能需要几分钟时间。 使用 通知 区域监视部署进度。 在数据库成功部署之后,不要执行下一步。 部署数据库后,将为移动应用后端应用设置中的 SQL 数据库实例创建连接字符串。 可以在 设置>应用程序设置中看到此应用设置,>连接字符串

需要身份验证才能访问表

若要将应用服务身份验证用于 tables 终结点,必须先在 Azure 门户 配置应用服务身份验证。 有关详细信息,请参阅要使用的标识提供者的配置指南:

每个表都有一个访问属性,可用于控制对表的访问。 以下示例显示了一个静态定义的表,其中包含所需的身份验证。

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;

访问属性可以采用以下三个值之一:

  • 匿名 表示允许客户端应用程序在没有身份验证的情况下读取数据。
  • 经过身份验证的 指示客户端应用程序必须在请求中发送有效的身份验证令牌。
  • 禁用 表示此表当前已禁用。

如果未定义访问属性,则允许未经身份验证的访问。

使用身份验证凭证与数据表

可以设置在进行身份验证时请求的各种用户声明。 这些声明通常无法通过 context.user 对象提供。 但是,可以使用 context.user.getIdentity() 方法检索它们。 getIdentity() 方法返回解析为对象的承诺。 该对象由身份验证方法(facebookgoogletwittermicrosoftaccountaad)进行密钥。

例如,如果设置了Microsoft帐户身份验证并请求电子邮件地址声明,则可以使用下表控制器将电子邮件地址添加到记录:

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;

若要查看可用的声明,请使用 Web 浏览器查看网站的 /.auth/me 终结点。

禁用对特定表操作的访问

除了显示在表上之外,访问属性还可用于控制单个操作。 有四个操作:

  • read 是表上的 RESTful GET 操作。
  • insert 是表上的 RESTful POST 操作。
  • update 是表上的 RESTful PATCH 操作。
  • delete 是表上的 RESTful 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;

调整用于表操作的查询

表操作的一个常见要求是提供数据的受限视图。 例如,可以提供使用经过身份验证的用户 ID 标记的表,以便只能读取或更新自己的记录。 下表定义提供此功能:

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;

通常运行查询的操作具有一个可以使用where子句进行调整的查询属性。 查询属性是一个 QueryJS 对象,该对象用于将 OData 查询转换为数据后端可以处理的内容。 对于简单的相等情况(如前面的情况),可以使用地图。 还可以添加特定的 SQL 子句:

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

在表上配置软删除

软删除实际上不会删除记录。 而是通过将数据库中的删除列设置为 true,将它们标记为已删除。 除非移动客户端 SDK 使用 IncludeDeleted(),否则移动应用程序 SDK 会自动从结果中删除被软删除的记录。 若要为软删除配置表,请在表定义文件中设置 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;

应建立删除记录的机制:客户端应用程序、WebJob、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-ui 安装为依赖项:

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://yoursite.azurewebsites.net/swagger。 可以通过 /swagger/ui 终结点访问 Swagger UI。 如果选择在整个应用程序中要求进行身份验证,Swagger 将生成错误。 为获得最佳结果,请选择在 Azure 应用服务身份验证/授权设置中允许未经身份验证的请求,然后使用 table.access 属性控制身份验证。

如果您只想在本地开发时启用 Swagger 支持,还可以将 Swagger 选项添加到 azureMobile.js 文件中。

推送通知

移动应用与 Azure 通知中心集成,以便你可以跨所有主要平台向数百万台设备发送定向推送通知。 通过使用通知中心,可以将推送通知发送到 iOS、Android 和 Windows 设备。 若要详细了解使用通知中心可以执行的所有任务,请参阅 通知中心概述

发送推送通知

以下代码演示如何使用 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.
        }
    });
}

通过从客户端创建模板推送注册,您可以将模板推送消息发送到所有受支持平台的设备上。 以下代码演示如何发送模板通知:

// 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.
        }
    });
}

使用标记将推送通知发送到经过身份验证的用户

当经过身份验证的用户注册推送通知时,用户 ID 标记会自动添加到注册中。 使用此标记,可以将推送通知发送到特定用户注册的所有设备。 以下代码获取发出请求的用户的 SID,并向该用户的每个设备注册发送模板推送通知:

// 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.
        }
    });
}

从经过身份验证的客户端注册推送通知时,请确保在尝试注册之前完成身份验证。

自定义 API

定义自定义 API

除了通过 /tables 终结点访问数据访问 API 外,移动应用还可以提供自定义 API 覆盖范围。 自定义 API 的定义方式与表定义类似,可以访问所有相同的设施,包括身份验证。

若要将应用服务身份验证与自定义 API 配合使用,必须先在 azure 门户 配置应用服务身份验证。 有关详细信息,请参阅要使用的标识提供者的配置指南:

自定义 API 的定义方式与表 API 大致相同:

  1. 创建 api 目录。
  2. api 目录中创建 API 定义 JavaScript 文件。
  3. 使用导入方法导入 api 目录。

下面是基于我们之前使用的基本应用示例的原型 API 定义:

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);

让我们使用 Date.now() 方法返回服务器日期的示例 API。 下面是 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;

用于 tables 终结点的同一令牌必须用于需要身份验证的自定义 API。

处理大型文件上传

移动应用 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 应用程序可以访问各种诊断日志工具。 在内部,移动应用 Node.js SDK 使用 Winston 进行诊断日志记录。 启用调试模式或在 Azure 门户 MS_DebugMode中将 应用设置设为 true 时,会自动启用日志记录。 生成的日志显示在 Azure 门户的诊断日志中。