Azure Mobile Apps용 Node.js SDK를 사용하는 방법

이 문서에서는 Azure Mobile Apps용 NodeJS 백 엔드를 사용하는 방법을 보여 주는 자세한 정보와 예제를 제공합니다.

소개

Azure Mobile Apps는 모바일에 최적화된 데이터 액세스 웹 API를 웹 애플리케이션에 추가하는 기능을 제공합니다. Azure Mobile Apps SDK는 ASP.NET Framework 및 Node.js 웹 애플리케이션에 제공됩니다. SDK는 다음 작업을 제공합니다.

  • 데이터 액세스를 위한 테이블 작업(읽기, 삽입, 업데이트, 삭제)
  • API 작업 사용자 지정

두 작업 모두 Azure 앱 Service에서 허용하는 모든 ID 공급자에서 인증을 제공합니다. 이러한 공급자에는 Facebook, Twitter, Google 및 Microsoft와 같은 소셜 ID 공급자와 엔터프라이즈 ID에 대한 Microsoft Entra ID가 포함됩니다.

지원되는 플랫폼

Azure Mobile Apps Node.js SDK는 Node 6.x 이상을 지원하며, Node 12.x까지 테스트되었습니다. 다른 버전의 노드는 작동하지만 지원되지 않습니다.

Azure Mobile Apps Node.js SDK는 두 개의 데이터베이스 드라이버를 지원합니다.

  • node-mssql 드라이버는 Azure SQL Database 및 로컬 SQL Server 인스턴스를 지원합니다.
  • sqlite3 드라이버는 단일 인스턴스에서만 SQLite 데이터베이스를 지원합니다.

명령줄을 사용하여 기본 노드 백 엔드 만들기

모든 Azure Mobile Apps Node.js 백 엔드는 Express 애플리케이션으로 시작됩니다. Express는 Node.js에 사용할 수 있는 가장 인기 있는 웹 서비스 프레임워크입니다. 다음과 같이 기본 Express 애플리케이션을 만들 수 있습니다.

  1. 명령 창 또는 PowerShell 창에서 프로젝트의 디렉터리를 만듭니다.

    $ mkdir basicapp
    
  2. 실행 npm init 하여 패키지 구조를 초기화합니다.

    $ cd basicapp
    $ npm init
    

    npm init 명령은 프로젝트를 초기화하기 위해 몇 가지 질문을 합니다. 예제 출력을 참조하세요.

    The npm init output

  3. express npm 리포지토리에서 및 azure-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);
    

이 애플리케이션은 동적 스키마를 사용하여 기본 SQL 데이터 저장소에 대한 인증되지 않은 액세스를 제공하는 단일 엔드포인트(/tables/TodoItem)를 사용하여 모바일 최적화 Web API를 만듭니다. 클라이언트 라이브러리 빠른 시작을 따르는 데 적합합니다.

이 기본 애플리케이션에 대한 코드는 GitHub의 샘플 영역에서 찾을 수 있습니다.

애플리케이션에 홈페이지 사용

많은 애플리케이션은 웹 및 모바일 앱의 조합입니다. Express 프레임워크를 사용하여 두 패싯을 결합할 수 있습니다. 그러나 경우에 따라 모바일 인터페이스만 구현하려고 할 수 있습니다. 앱 서비스가 실행 중인지 확인하기 위해 홈페이지를 제공하는 것이 유용합니다. 고유한 홈 페이지에 제공하거나 임시 홈 페이지를 사용할 수 있습니다. 임시 홈페이지를 사용하도록 설정하려면 다음 코드를 사용하여 Azure Mobile Apps를 인스턴스화합니다.

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

로컬로 개발하는 경우에만 이 옵션을 사용할 수 있도록 하려면 이 설정을 azureMobile.js 구성 파일에 추가할 수 있습니다.

module.exports = {
    homePage: true,
};

필요에 따라 azureMobile.js 파일에 다른 설정을 추가할 수 있습니다.

테이블 작업

azure-mobile-apps Node.js 서버 SDK는 Azure SQL Database에 저장된 데이터 테이블을 Web API로 노출하는 메커니즘을 제공합니다. 다음 5가지 작업을 제공합니다.

연산 설명
GET /tables/tablename 테이블의 모든 레코드를 가져옵니다.
GET /tables/tablename/:id 테이블에서 특정 레코드를 가져옵니다.
POST /tables/tablename 테이블에 레코드를 만듭니다.
PATCH /tables/tablename/:id 테이블의 레코드를 업데이트합니다.
DELETE /tables/tablename/:id 테이블에서 레코드를 삭제합니다.

이 Web API는 OData v3를 지원하고 테이블 스키마를 확장하여 오프라인 데이터 동기화를 지원합니다.

동적 스키마를 사용하여 테이블 정의

테이블을 사용하려면 먼저 정의해야 합니다. 정적 스키마(스키마 내에서 열을 정의하는 위치)를 사용하거나 동적으로(SDK가 들어오는 요청에 따라 스키마를 제어하는 위치) 테이블을 정의할 수 있습니다. 또한 정의에 JavaScript 코드를 추가하여 Web API의 특정 측면을 제어할 수 있습니다.

모범 사례로, 디렉터리의 JavaScript 파일에서 tables 각 테이블을 정의한 다음, 메서드를 tables.import() 사용하여 테이블을 가져와야 합니다. basic-app 샘플을 확장하면 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;

테이블은 기본적으로 동적 스키마를 사용합니다.

정적 스키마를 사용하여 테이블 정의

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() 메서드는 promise를 반환합니다.

로컬 컴퓨터에서 개발 데이터 저장소로 SQL Server Express 사용

Azure Mobile Apps Node.js SDK는 데이터를 기본 제공에 사용할 수 있는 세 가지 옵션을 제공합니다.

  • 메모리 드라이버를 사용하여 비영구 예제 저장소를 제공합니다.
  • mssql 드라이버를 사용하여 개발을 위한 SQL Server Express 데이터 저장소를 제공합니다.
  • mssql 드라이버를 사용하여 프로덕션용 Azure SQL Database 데이터 저장소를 제공합니다.

Azure Mobile Apps Node.js SDK는 mssql Node.js 패키지를 사용하여 SQL Server Express 및 SQL Database에 대한 연결을 설정하고 사용합니다. 이 패키지는 SQL Server Express 인스턴스에서 TCP 연결을 사용해야 합니다.

메모리 드라이버는 테스트하기 위한 완전한 기능 집합을 제공하지 않습니다. 백 엔드를 로컬로 테스트하려면 SQL Server Express 데이터 저장소 및 mssql 드라이버를 사용하는 것이 좋습니다.

  1. Microsoft SQL Server 2019 Developer를 다운로드하고 설치합니다.

  2. Configuration Manager 실행:

    • 트리 메뉴에서 SQL Server 네트워크 구성 노드를 확장합니다.
    • 인스턴스 이름에 대한 프로토콜을 선택합니다.
    • 마우스 오른쪽 단추로 TCP/IP를 클릭하고 사용을 선택합니다. 팝업 대화 상자에서 확인을 선택합니다.
    • 트리 메뉴에서 SQL Server 서비스를 선택합니다.
    • SQL Server(인스턴스 이름)를 마우스 오른쪽 단추로 클릭하고 다시 시작을 선택합니다.
    • Configuration Manager를 닫습니다.

또한 Azure Mobile Apps에서 데이터베이스에 연결하는 데 사용할 수 있는 사용자 이름 및 암호를 만들어야 합니다. 만든 dbcreator 사용자에게 서버 역할이 있는지 확인합니다. 사용자를 구성하는 방법에 대한 자세한 내용은 SQL Server 설명서를 참조하세요.

선택한 사용자 이름 및 암호를 기록해야 합니다. 데이터베이스 요구 사항에 따라 더 많은 서버 역할 또는 권한을 할당해야 할 수 있습니다.

Node.js 애플리케이션은 이 데이터베이스에 SQLCONNSTR_MS_TableConnectionString 대한 연결 문자열 대한 환경 변수를 읽습니다. 사용자 환경에서 이 변수를 설정할 수 있습니다. 예를 들어 이 환경 변수를 설정하려면 PowerShell을 사용할 수 있습니다.

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

TCP/IP 연결을 통해 데이터베이스에 액세스합니다. 연결에 대한 사용자 이름 및 암호를 제공합니다.

로컬 개발에 대한 프로젝트 구성

Azure Mobile Apps는 로컬 파일 시스템에서 호출 azureMobile.js 된 JavaScript 파일을 읽습니다. 이 파일을 사용하여 프로덕션 환경에서 Azure Mobile Apps SDK를 구성하지 마세요. 대신 Azure Portal에서 앱 설정을 사용합니다.

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'
    }
};

암호가 클라우드에 .gitignore 저장되지 않도록 파일(또는 기타 소스 코드 제어 무시 파일)에 추가하는 azureMobile.js 것이 좋습니다.

모바일 앱에 대한 앱 설정 구성

파일의 azureMobile.js 대부분의 설정에는 Azure Portal에서 동일한 앱 설정이 있습니다. 다음 목록을 사용하여 앱 설정에서 앱을 구성합니다.

앱 설정 azureMobile.js 설정 설명 유효한 값
MS_MobileAppName name 앱의 이름 string
MS_MobileLoggingLevel logging.level 기록할 메시지의 최소 로그 수준 오류, 경고, 정보, 자세한 정보, 디버그, 바보 같은
MS_DebugMode 디버그 디버그 모드를 사용하거나 사용하지 않도록 설정 true, false
MS_TableSchema data.schema SQL 테이블에 대한 기본 스키마 이름 string(기본값: dbo)
MS_DynamicSchema data.dynamicSchema 디버그 모드를 사용하거나 사용하지 않도록 설정 true, false
MS_DisableVersionHeader 버전(정의되지 않음으로 설정) X-ZUMO-Server-Version 헤더를 사용하지 않도록 설정 true, false
MS_SkipVersionCheck skipversion검사 클라이언트 API 버전 검사를 사용하지 않도록 설정 true, false

대부분의 앱은 설정 변경 후 서비스를 다시 시작해야 합니다.

Azure SQL을 프로덕션 데이터 저장소로 사용

Azure SQL Database를 데이터 저장소로 사용하는 것은 모든 Azure 앱 Service 애플리케이션 유형에서 동일합니다. 아직 수행하지 않은 경우 다음 단계에 따라 Azure 앱 서비스 백 엔드를 만듭니다. Azure SQL 인스턴스를 만든 다음, 사용하려는 Azure SQL 인스턴스에 대한 연결 문자열 앱 설정을 SQLCONNSTR_MS_TableConnectionString 설정합니다. 백 엔드를 실행하는 Azure 앱 서비스가 Azure SQL 인스턴스와 통신할 수 있는지 확인합니다.

테이블에 액세스하려면 인증 필요

엔드포인트에서 App Service 인증을 tables 사용하려면 먼저 Azure Portal에서 App Service 인증을 구성해야 합니다. 자세한 내용은 사용하려고 하는 ID 공급자에 대한 구성 가이드를 참조하세요.

각 테이블에는 테이블에 대한 액세스를 제어하는 데 사용할 수 있는 액세스 속성이 있습니다. 다음 샘플에서는 인증이 필요한 정적으로 정의된 테이블을 보여 줍니다.

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;

액세스 속성은 세 가지 값 중 하나를 사용할 수 있습니다.

  • 익명은 클라이언트 애플리케이션이 인증 없이 데이터를 읽을 수 있다는 것을 나타냅니다.
  • 인증됨 은 클라이언트 애플리케이션이 요청과 함께 유효한 인증 토큰을 보내야 임을 나타냅니다.
  • disabled 는 이 테이블이 현재 사용하지 않도록 설정되어 있음을 나타냅니다.

액세스 속성을 정의하지 않으면 인증되지 않은 액세스가 허용됩니다.

테이블과 함께 인증 클레임 사용

인증이 설정될 때 요청되는 다양한 클레임을 설정할 수 있습니다. 이러한 클레임은 일반적으로 개체를 context.user 통해 사용할 수 없습니다. 그러나 메서드를 사용하여 검색할 context.user.getIdentity() 수 있습니다. 이 메서드는 getIdentity() 개체로 확인되는 프라미스를 반환합니다. 개체는 인증 방법(facebook, google, twitter, microsoftaccount 또는 aad)을 키로 사용합니다.

참고 항목

Microsoft Entra ID를 통해 Microsoft 인증을 사용하는 경우 인증 방법은 aad그렇지 않습니다 microsoftaccount.

예를 들어 Microsoft Entra 인증을 설정하고 이메일 주소 클레임을 요청하는 경우 다음 테이블 컨트롤러를 사용하여 전자 메일 주소를 레코드에 추가할 수 있습니다.

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.aad.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.aad.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 는 테이블에 대한 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 . 쿼리 속성은 OData 쿼리를 데이터 백 엔드에서 처리할 수 있는 쿼리로 변환하는 데 사용되는 QueryJS 개체입니다. 이전과 같은 단순 같음 사례의 경우 맵을 사용할 수 있습니다. 또한 특정 SQL 절을 추가할 수 있습니다.

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

테이블에서 일시 삭제 구성

일시 삭제는 실제로 레코드를 삭제하지 않습니다. 대신 삭제된 열을 true로 설정하여 데이터베이스 내에서 삭제된 것으로 표시합니다. Azure Mobile Apps SDK는 Mobile Client 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;

클라이언트 애플리케이션, WebJob, Azure Function 또는 사용자 지정 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;

데이터 시드는 Azure Mobile Apps SDK를 사용하여 테이블을 만든 경우에만 발생합니다. 테이블이 데이터베이스에 이미 있는 경우 테이블에 데이터가 삽입되지 않습니다. 동적 스키마가 켜져 있으면 스키마가 시드된 데이터에서 유추됩니다.

서비스를 실행하기 시작할 때 명시적으로 메서드를 호출 tables.initialize() 하여 테이블을 만드는 것이 좋습니다.

Swagger 지원 사용

Azure Mobile Apps에는 기본 제공 Swagger 지원이 제공됩니다. Swagger 지원을 사용하도록 설정하려면 먼저 swagger-ui를 종속성으로 설치합니다.

npm install --save swagger-ui

그런 다음, Azure Mobile Apps 생성자에서 Swagger 지원을 사용하도록 설정할 수 있습니다.

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

개발 버전에서만 Swagger 지원을 사용하도록 설정하려고 할 수 있습니다. NODE_ENV 앱 설정을 사용하여 개발에서 Swagger 지원을 사용하도록 설정할 수 있습니다.

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

엔드포인트는 swagger http:// yoursite.azurewebsites.net/swagger 있습니다. 엔드포인트를 통해 Swagger UI에 /swagger/ui 액세스할 수 있습니다. 전체 애플리케이션에서 인증을 요구하도록 선택하면 Swagger가 오류를 생성합니다. 최상의 결과를 위해 table.access 속성을 사용하여 Azure App Service 인증/권한 부여 설정 및 제어 인증에서 인증되지 않은 요청을 허용하도록 선택합니다.

또한 로컬 개발에 대한 Swagger 지원만 원하는 경우 Swagger 옵션을 azureMobile.js 파일에 추가할 수 있습니다.

사용자 지정 API

엔드포인트를 통한 /tables 데이터 액세스 API 외에도 Azure Mobile Apps는 사용자 지정 API 범위를 제공할 수 있습니다. 사용자 지정 API는 테이블 정의와 비슷한 방식으로 정의되며 인증을 비롯한 모든 동일한 기능에 액세스할 수 있습니다.

사용자 지정 API 정의

사용자 지정 API는 거의 동일한 방식으로 테이블 API로 정의됩니다.

  1. api 디렉터리를 만듭니다.
  2. 디렉터리에 API 정의 JavaScript 파일을 api 만듭니다.
  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에 액세스하려면 인증 필요

Azure Mobile Apps 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에 사용해야 합니다.

대용량 파일 업로드 처리

Azure Mobile Apps 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 문 실행

Azure Mobile Apps 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 Azure 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 Mobile Apps 디버그, 진단 및 문제 해결

Azure 앱 Service는 Node.js 애플리케이션에 대한 몇 가지 디버깅 및 문제 해결 기술을 제공합니다. Node.js Azure Mobile Apps 백 엔드 문제 해결을 시작하려면 다음 문서를 참조하세요.

Node.js 애플리케이션은 광범위한 진단 로그 도구에 액세스할 수 있습니다. 내부적으로 Azure Mobile Apps Node.js SDK는 진단 로깅에 [Winston]을 사용합니다. Azure Portal에서 디버그 모드를 사용하도록 설정하거나 앱 설정을 true로 설정 MS_DebugMode 하면 로깅이 자동으로 활성화됩니다. 생성된 로그는 Azure Portal의 진단 로그에 표시됩니다.