text:
How to use the Mobile Apps Node.js SDK
Visual Studio App Center supports end to end and integrated services central to mobile app development. Developers can use Build, Test and Distribute services to set up Continuous Integration and Delivery pipeline. Once the app is deployed, developers can monitor the status and usage of their app using the Analytics and Diagnostics services, and engage with users using the Push service. Developers can also leverage Auth to authenticate their users and Data service to persist and sync app data in the cloud.
If you are looking to integrate cloud services in your mobile application, sign up with App Center today.
This article provides detailed information and examples that show how to work with a Node.js back end in the Mobile Apps feature of Azure App Service.
Mobile Apps provides the capability to add a mobile-optimized data access Web API to a web application. The Mobile Apps SDK is provided for ASP.NET and Node.js web applications. The SDK provides the following operations:
- Table operations (read, insert, update, delete) for data access
- Custom API operations
Both operations provide for authentication across all identity providers that Azure App Service allows. These providers include social identity providers such as Facebook, Twitter, Google, and Microsoft, as well as Azure Active Directory for enterprise identity.
You can find samples for each use case in the samples directory on GitHub.
Supported platforms
The Mobile Apps Node.js SDK supports the current LTS release of Node and later. Currently, the latest LTS version is Node v4.5.0. Other versions of Node might work but are not supported.
The Mobile Apps Node.js SDK supports two database drivers:
- The node-mssql driver supports Azure SQL Database and local SQL Server instances.
- The sqlite3 driver supports SQLite databases on a single instance only.
Create a basic Node.js back end by using the command line
Every Mobile Apps Node.js back end starts as an ExpressJS application. ExpressJS is the most popular web service framework available for Node.js. You can create a basic Express application as follows:
In a command or PowerShell window, create a directory for your project:
mkdir basicapp
npm initto initialize the package structure:
cd basicapp npm init
npm initcommand asks a set of questions to initialize the project. See the example output:
Install the
azure-mobile-appslibraries from the npm repository:
npm install --save express azure-mobile-apps
Create an app.js file to implement the basic mobile server:
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);
This application creates a mobile-optimized Web API with a single endpoint (
/tables/TodoItem) that provides
unauthenticated access to an underlying SQL data store by using a dynamic schema. It is suitable for following the
client library quickstarts:
- Android client quickstart
- Apache Cordova client quickstart
- iOS Client quickstart
- Windows Store client quickstart
- Xamarin.iOS client quickstart
- Xamarin.Android client quickstart
- Xamarin.Forms client quickstart
You can find the code for this basic application in the basicapp sample on GitHub.
Create a Node.js back end by using Visual Studio 2015
Visual Studio 2015 requires an extension to develop Node.js applications within the IDE. To start, install the Node.js Tools 1.1 for Visual Studio. When you finish the installation, create an Express 4.x application:
Open the New Project dialog box (from File > New > Project).
Expand Templates > JavaScript > Node.js.
Select Basic Azure Node.js Express 4 Application.
Fill in the project name. Select OK.
Right-click the npm node and select Install New npm packages.
You might need to refresh the npm catalog after you create your first Node.js application. Select Refresh if necessary.
Enter azure-mobile-apps in the search box. Select the azure-mobile-apps 2.0.0 package, and then select Install Package.
Select Close.
Open the app.js file to add support for the Mobile Apps SDK. At line 6 at the bottom of the library
requirestatements, add the following code:
var bodyParser = require('body-parser'); var azureMobileApps = require('azure-mobile-apps');
At approximately line 27 after the other
app.usestatements, add the following code:
app.use('/users', users); // Mobile Apps initialization var mobile = azureMobileApps(); mobile.tables.add('TodoItem'); app.use(mobile);
Save the file.
Either run the application locally (the API is served on
http://localhost:3000) or publish to Azure.
Create a Node.js back end by using the Azure portal
You can create a Mobile Apps back end right in the Azure portal. You can either complete the following steps or create a client and server together by following the Create a mobile app tutorial. The tutorial contains a simplified version of these instructions and is best for proof-of-concept projects.
Sign in at the Azure portal.
Select +NEW > Web + Mobile > Mobile App, and then provide a name for your Mobile Apps back end.
For Resource Group, select an existing resource group, or create a new one (by using the same name as your app).
For App Service plan, the default plan (in the Standard tier) is selected. You can also select a different plan, or create a new one.
The App Service plan's settings determine the location, features, cost, and compute resources associated with your app. For more about App Service plans and how to create a new plan in a different pricing tier and in your desired location, see Azure App Service plans in-depth overview.
Select Create. This step creates the Mobile Apps back end.
In the Settings pane for the new Mobile Apps back end, select Quick start > your client app platform > Connect a database.
In the Add data connection pane, select SQL Database > Create a new database. Enter the database name, choose a pricing tier, and then select Server. You can reuse this new database. If you already have a database in the same location, you can instead choose Use an existing database. We don't recommend the use of a database in a different location, due to bandwidth costs and higher latency.
In the New server pane, enter a unique server name in the Server name box, provide a login and password, select Allow Azure services to access server, and select OK. This step creates the new database.
Back in the Add data connection pane, select Connection string, enter the login and password values for your database, and select OK.
Wait a few minutes for the database to be deployed successfully before you proceed.
Back in the Get started pane, under Create a table API, choose Node.js as your back-end language. Select the box for I acknowledge that this will overwrite all site contents, and then select Create TodoItem table.
Download the Node.js back-end quickstart code project by using Git
When you create a Node.js Mobile Apps back end by using the portal's Quick start pane, a Node.js project is created for you and deployed to your site. In the portal, you can add tables and APIs, and edit code files for the Node.js back end. You can also use various deployment tools to download the back-end project so that you can add or modify tables and APIs, and then republish the project. For more information, see the Azure App Service deployment guide.
The following procedure uses a Git repository to download the quickstart project code:
Install Git, if you haven't already done so. The steps required to install Git vary between operating systems. For operating system-specific distributions and installation guidance, see Installing Git.
See Prepare your repository to enable the Git repository for your back-end site. Make a note of the deployment username and password.
In the pane for your Mobile Apps back end, make a note of the Git clone URL setting.
Execute the
git clonecommand by using the Git clone URL. Enter your password when required, as in the following example:
$ git clone https://email@example.com:443/todolist.git
Browse to the local directory (
/todolistin the preceding example), and notice that project files have been downloaded. Locate the todoitem.json file in the
/tablesdirectory. This file defines permissions on the table. Also find the todoitem.js file in the same directory. It defines the CRUD operation scripts for the table.
After you make changes to project files, run the following commands to add, commit, and then upload the changes to the site:
$ git commit -m "updated the table script" $ git push origin master
When you add new files to the project, you first need to run the
git add .command.
The site is republished every time a new set of commits is pushed to the site.
Publish your Node.js back end to Azure
Microsoft Azure provides many mechanisms for publishing your Mobile Apps Node.js back end to the Azure service. These mechanisms include deployment tools integrated into Visual Studio, command-line tools, and continuous deployment options based on source control. For more information, see the Azure App Service deployment guide.
Azure App Service has specific advice for Node.js applications that you should review before you publish the back end:
- How to specify the Node version
- How to use Node modules
Enable a home page for your application
Many applications are a combination of web and mobile apps. You can use the ExpressJS framework to combine the two facets. Sometimes, however, you might want to only implement a mobile interface. It's useful to provide a home page to ensure that the app service is up and running. You can either provide your own home page or enable a temporary home page. To enable a temporary home page, use the following code to instantiate Mobile Apps:
var mobile = azureMobileApps({ homePage: true });
If you only want this option available when developing locally, you can add this setting to your azureMobile.js file.
Table operations
The azure-mobile-apps Node.js Server SDK provides mechanisms to expose data tables stored in Azure SQL Database as a Web API. It provides five operations:
|GET /tables/tablename
|Get all records in the table.
|GET /tables/tablename/:id
|Get a specific record in the table.
|POST /tables/tablename
|Create a record in the table.
|PATCH /tables/tablename/:id
|Update a record in the table.
|DELETE /tables/tablename/:id
|Delete a record in the table.
This Web API supports OData and extends the table schema to support offline data sync.
Define tables by using a dynamic schema
Before you can use a table, you must define it. You can define tables by using a static schema (where you define the columns in the schema) or dynamically (where the SDK controls the schema based on incoming requests). In addition, you can control specific aspects of the Web API by adding JavaScript code to the definition.
As a best practice, you should define each table in a JavaScript file in the
tables directory, and then use the
tables.import() method to import the tables. Extending the basic-app sample, you would adjust the app.js file:
var express = require('express'),
azureMobileApps = require('azure-mobile-apps');
var app = express(),
mobile = azureMobileApps();
// Define the database schema that is exposed.
// 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.
// Start listening on HTTP.
app.listen(process.env.PORT || 3000);
Define the table in ./tables/TodoItem.js:
var azureMobileApps = require('azure-mobile-apps');
var table = azureMobileApps.table();
// Additional configuration for the table goes here.
module.exports = table;
Tables use a dynamic schema by default. To turn off the dynamic schema globally, set the
MS_DynamicSchema app setting to false in the Azure portal.
You can find a complete example in the todo sample on GitHub.
Define tables by using a static schema
You can explicitly define the columns to expose via the Web API. The azure-mobile-apps Node.js SDK automatically
adds any extra columns required for offline data sync to the list that you provide. For example, the
quickstart client applications require a table with two columns:
text (a string) and
complete (a Boolean).
The table can be defined in the table definition JavaScript file (located in the
tables directory) as follows:
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;
If you define tables statically, you must also call the
tables.initialize() method to create the database
schema on startup. The
tables.initialize() method returns a promise so that the web service does not serve
requests before the database is initialized.
Use SQL Server Express as a development data store on your local machine
The Mobile Apps Node.js SDK provides three options for serving data out of the box:
- Use the memory driver to provide a non-persistent example store.
- Use the mssql driver to provide a SQL Server Express data store for development.
- Use the mssql driver to provide an Azure SQL Database data store for production.
The Mobile Apps Node.js SDK uses the mssql Node.js package to establish and use a connection to both SQL Server Express and SQL Database. This package requires that you enable TCP connections on your SQL Server Express instance.
The memory driver does not provide a complete set of facilities for testing. If you want to test your back end locally, we recommend the use of a SQL Server Express data store and the mssql driver.
Download and install Microsoft SQL Server 2014 Express. Ensure that you install the SQL Server 2014 Express with Tools edition. Unless you explicitly require 64-bit support, the 32-bit version consumes less memory when running.
Run SQL Server 2014 Configuration Manager:
a. Expand the SQL Server Network Configuration node in the tree menu.
b. Select Protocols for SQLEXPRESS.
c. Right-click TCP/IP and select Enable. Select OK in the pop-up dialog box.
d. Right-click TCP/IP and select Properties.
e. Select the IP Addresses tab.
f. Find the IPAll node. In the TCP Port field, enter 1433.
g. Select OK. Select OK in the pop-up dialog box.
h. Select SQL Server Services in the tree menu.
i. Right-click SQL Server (SQLEXPRESS) and select Restart.
j. Close SQL Server 2014 Configuration Manager.
Run SQL Server 2014 Management Studio and connect to your local SQL Server Express instance:
Right-click your instance in Object Explorer and select Properties.
Select the Security page.
Ensure that SQL Server and Windows Authentication mode is selected.
Select OK.
Expand Security > Logins in Object Explorer.
Right-click Logins and select New Login.
Enter a login name. Select SQL Server authentication. Enter a password, and then enter the same password in Confirm password. The password must meet Windows complexity requirements.
Select OK.
Right-click your new login and select Properties.
Select the Server Roles page.
Select the check box for the dbcreator server role.
Select OK.
Close SQL Server 2015 Management Studio.
Be sure to record the username and password that you selected. You might need to assign additional server roles or permissions, depending on your database requirements.
The Node.js application reads the
SQLCONNSTR_MS_TableConnectionString environment variable for
the connection string for this database. You can set this variable in your environment. For example,
you can use PowerShell to set this environment variable:
$env:SQLCONNSTR_MS_TableConnectionString = "Server=127.0.0.1; Database=mytestdatabase; User Id=azuremobile; Password=T3stPa55word;"
Access the database through a TCP/IP connection. Provide a username and password for the connection.
Configure your project for local development
Mobile Apps reads a JavaScript file called azureMobile.js from the local file system. Do not use this file to configure the Mobile Apps SDK in production. Instead, use App settings in the Azure portal.
The azureMobile.js file should export a configuration object. The most common settings are:
- Database settings
- Diagnostic logging settings
- Alternate CORS settings
This example azureMobile.js file implements the preceding database settings:
module.exports = {
cors: {
origins: [ 'localhost' ]
data: {
provider: 'mssql',
server: '127.0.0.1',
database: 'mytestdatabase',
user: 'azuremobile',
password: 'T3stPa55word'
logging: {
level: 'verbose'
We recommend that you add azureMobile.js to your .gitignore file (or other source code control ignore file) to prevent passwords from being stored in the cloud. Always configure production settings in App settings within the Azure portal.
Configure app settings for your mobile app
Most settings in the azureMobile.js file have an equivalent app setting in the Azure portal. Use the following list to configure your app in App settings:
|App setting
|azureMobile.js setting
|Valid values
|Name of the app
|Minimum log level of messages to log
|error, warning, info, verbose, debug, silly
|Enables or disables debug mode
|true, false
|Default schema name for SQL tables
|string (default: dbo)
|Enables or disables debug mode
|true, false
|version (set to undefined)
|Disables the X-ZUMO-Server-Version header
|true, false
|Disables the client API version check
|true, false
To set an app setting:
- Sign in to the Azure portal.
- Select All resources or App Services, and then select the name of your mobile app.
- The Settings pane opens by default. If it doesn't, select Settings.
- On the GENERAL menu, select Application settings.
- Scroll to the App settings section.
- If your app setting already exists, select the value of the app setting to edit the value. If your app setting does not exist, enter the app setting in the Key box and the value in the Value box.
- Select Save.
Changing most app settings requires a service restart.
Use SQL Database as your production data store
Using Azure SQL Database as a data store is identical across all Azure App Service application types. If you have not done so already, follow these steps to create a Mobile Apps back end:
Sign in to the Azure portal.
In the upper left of the window, select the +NEW button > Web + Mobile > Mobile App, and then provide a name for your Mobile Apps back end.
In the Resource Group box, enter the same name as your app.
The default App Service plan is selected. If you want to change your App Service plan:
a. Select App Service Plan > +Create New.
b. Provide a name of the new App Service plan and select an appropriate location.
c. Select an appropriate pricing tier for the service. Select View all to view more pricing options, such as Free and Shared.
d. Click the Select button.
e. Back in the App Service plan pane, select OK.
Select Create.
Provisioning a Mobile Apps back end can take a couple of minutes. After the Mobile Apps back end is provisioned, the portal opens the Settings pane for the Mobile Apps back end.
You can choose to either connect an existing SQL database to your Mobile Apps back end or create a new SQL database. In this section, we create a SQL database.
If you already have a database in the same location as the Mobile Apps back end, you can instead select Use an existing database and then select that database. We don't recommend the use of a database in a different location because of higher latencies.
In the new Mobile Apps back end, select Settings > Mobile App > Data > +Add.
In the Add data connection pane, select SQL Database - Configure required settings > Create a new database. Enter the name of the new database in the Name box.
Select Server. In the New server pane, enter a unique server name in the Server name box, and provide a suitable server admin login and password. Ensure that Allow azure services to access server is selected. Select OK.
In the New database pane, select OK.
Back in the Add data connection pane, select Connection string, and enter the login and password that you provided when you created the database. If you use an existing database, provide the login credentials for that database. Select OK.
Back in the Add data connection pane again, select OK to create the database.
Creation of the database can take a few minutes. Use the Notifications area to monitor the progress of the deployment. Do not progress until the database is deployed successfully. After the database is deployed, a connection string is created for the SQL Database instance in your Mobile Apps back-end app settings. You can see this app setting in Settings > Application settings > Connection strings.
Require authentication for access to tables
If you want to use App Service Authentication with the
tables endpoint, you must configure App Service
Authentication in the Azure portal first. For more information, see the configuration guide for the identity provider that you intend to use:
- Configure Azure Active Directory authentication
- Configure Facebook authentication
- Configure Google authentication
- Configure Microsoft authentication
- Configure Twitter authentication
Each table has an access property that you can use to control access to the table. The following sample shows a statically defined table with authentication required.
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;
The access property can take one of three values:
- anonymous indicates that the client application is allowed to read data without authentication.
- authenticated indicates that the client application must send a valid authentication token with the request.
- disabled indicates that this table is currently disabled.
If the access property is undefined, unauthenticated access is allowed.
Use authentication claims with your tables
You can set up various claims that are requested when authentication is set up. These claims are not normally
available through the
context.user object. However, you can retrieve them by using the
method. The
getIdentity() method returns a promise that resolves to an object. The object is keyed by the
authentication method (
microsoftaccount, or
For example, if you set up Microsoft account authentication and request the email addresses claim, you can add the email address to the record with the following table controller:
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.
// CREATE: add or overwrite the userId based on the authenticated user.
// UPDATE: only allow updating of records that belong to the authenticated user.
// DELETE: only allow deletion of records that belong to the authenticated user.
module.exports = table;
To see what claims are available, use a web browser to view the
/.auth/me endpoint of your site.
Disable access to specific table operations
In addition to appearing on the table, the access property can be used to control individual operations. There are four operations:
readis the RESTful GET operation on the table.
insertis the RESTful POST operation on the table.
updateis the RESTful PATCH operation on the table.
deleteis the RESTful DELETE operation on the table.
For example, you might want to provide a read-only unauthenticated table:
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;
Adjust the query that is used with table operations
A common requirement for table operations is to provide a restricted view of the data. For example, you can provide a table that is tagged with the authenticated user ID such that you can only read or update your own records. The following table definition provides this functionality:
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;
Operations that normally run a query have a query property that you can adjust by using a
where clause. The query
property is a QueryJS object that is used to convert an OData query to something that the data back end can
process. For simple equality cases (like the preceding one), you can use a map. You can also add specific SQL
context.query.where('myfield eq ?', 'value');
Configure a soft delete on a table
A soft delete does not actually delete records. Instead it marks them as deleted within the database by setting
the deleted column to true. The Mobile Apps SDK automatically removes soft-deleted records from results
unless the Mobile Client SDK uses
IncludeDeleted(). To configure a table for a soft delete, set the
property in the table definition file:
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;
You should establish a mechanism for deleting records: a client application, a WebJob, an Azure function, or a custom API.
Seed your database with data
When you're creating a new application, you might want to seed a table with data. You can do this within the table definition JavaScript file as follows:
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;
Seeding of data happens only when you've used the Mobile Apps SDK to create the table. If the table already exists in the database, no data is injected into the table. If the dynamic schema is turned on, the schema is inferred from the seeded data.
We recommend that you explicitly call the
tables.initialize() method to create the table when the service starts
Enable Swagger support
Mobile Apps comes with built-in Swagger support. To enable Swagger support, first install swagger-ui as a dependency:
npm install --save swagger-ui
You can then enable Swagger support in the Mobile Apps constructor:
var mobile = azureMobileApps({ swagger: true });
You probably only want to enable Swagger support in development editions. You can do this by using the
NODE_ENV app setting:
var mobile = azureMobileApps({ swagger: process.env.NODE_ENV !== 'production' });
swagger endpoint is located at http://yoursite.azurewebsites.net/swagger. You can access the Swagger
UI via the
/swagger/ui endpoint. If you choose to require authentication across your entire application,
Swagger produces an error. For best results, choose to allow unauthenticated requests in the Azure
App Service Authentication/Authorization settings, and then control authentication by using the
You can also add the Swagger option to your azureMobile.js file if you only want Swagger support for developing locally.
Push notifications
Mobile Apps integrates with Azure Notification Hubs so you can send targeted push notifications to millions of devices across all major platforms. By using Notification Hubs, you can send push notifications to iOS, Android, and Windows devices. To learn more about all that you can do with Notification Hubs, see the Notification Hubs overview.
Send push notifications
The following code shows how to use the
push object to send a broadcast push notification to registered 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.
By creating a template push registration from the client, you can instead send a template push message to devices on all supported platforms. The following code shows how to send a template notification:
// 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.
Send push notifications to an authenticated user by using tags
When an authenticated user registers for push notifications, a user ID tag is automatically added to the registration. By using this tag, you can send push notifications to all devices registered by a specific user. The following code gets the SID of user who's making the request and sends a template push notification to every device registration for that user:
// 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.
When you're registering for push notifications from an authenticated client, make sure that authentication is complete before you attempt registration.
Custom APIs
Define a custom API
In addition to the Data Access API via the
/tables endpoint, Mobile Apps can provide custom API coverage. Custom
APIs are defined in a similar way to the table definitions and can access all the same facilities, including authentication.
If you want to use App Service Authentication with a custom API, you must configure App Service Authentication in the Azure portal first. For more information, see the configuration guide for the identity provider that you intend to use:
- Configure Azure Active Directory authentication
- Configure Facebook authentication
- Configure Google authentication
- Configure Microsoft authentication
- Configure Twitter authentication
Custom APIs are defined in much the same way as the Tables API:
- Create an
- Create an API definition JavaScript file in the
- Use the import method to import the
Here is the prototype API definition based on the basic-app sample that we used earlier:
var express = require('express'),
azureMobileApps = require('azure-mobile-apps');
var app = express(),
mobile = azureMobileApps();
// Import the custom API.
// Add the Mobile API so it is accessible as a Web API.
// Start listening on HTTP
app.listen(process.env.PORT || 3000);
Let's take an example API that returns the server date by using the
Date.now() method. Here is the api/date.js
var api = {
get: function (req, res, next) {
var date = { currentTime: Date.now() };
module.exports = api;
Each parameter is one of the standard RESTful verbs: GET, POST, PATCH, or DELETE. The method is a standard ExpressJS middleware function that sends the required output.
Require authentication for access to a custom API
The Mobile Apps SDK implements authentication in the same way for both the
tables endpoint and custom APIs. To
add authentication to the API developed in the previous section, add an
access property:
var api = {
get: function (req, res, next) {
var date = { currentTime: Date.now() };
// All methods must be authenticated.
api.access = 'authenticated';
module.exports = api;
You can also specify authentication on specific operations:
var api = {
get: function (req, res, next) {
var date = { currentTime: Date.now() };
// The GET methods must be authenticated.
api.get.access = 'authenticated';
module.exports = api;
The same token that is used for the
tables endpoint must be used for custom APIs that require authentication.
Handle large file uploads
The Mobile Apps SDK uses the body-parser middleware to accept and decode body content in your submission. You can preconfigure body-parser to accept larger file uploads:
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.
// Add the Mobile API so it is accessible as a Web API.
// Start listening on HTTP.
app.listen(process.env.PORT || 3000);
The file is base-64 encoded before transmission. This encoding increases the size of the actual upload (and the size that you must account for).
Execute custom SQL statements
The Mobile Apps SDK allows access to the entire context through the request object. You can easily execute parameterized SQL statements to the defined data provider:
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.
.then(function (results) {
api.get.access = 'authenticated';
module.exports = api;
Debug, diagnose, and troubleshoot Mobile Apps
Azure App Service provides several debugging and troubleshooting techniques for Node.js applications. To get started in troubleshooting your Node.js Mobile Apps back end, see the following articles:
- Monitoring Azure App Service
- Enable diagnostic logging in Azure App Service
- Troubleshoot Azure App Service in Visual Studio
Node.js applications have access to a wide range of diagnostic log tools. Internally, the Mobile Apps
Node.js SDK uses Winston for diagnostic logging. Logging is automatically enabled when you enable debug mode or set the
MS_DebugMode app setting to true in the Azure portal. Generated logs appear in the diagnostic
logs in the Azure portal.
Loading feedback...


text:
Leaving Room for Quiet Moments
Sometimes life is in those quiet moments.
You know,
Those real live moments that are quiet.
The nothing but ticking of the clock.
The twitch of a cats tail.
The feeling of a baby inside a tummy stretching for more room.
The blinking of a cursor on screen as thoughts scattered try to come together.
I don't want to be so busy that I miss those moments.
And often we are in the quiet moments when we least expect it.
Leave room for the quiet moments. The moments that take us by surprise and make us pause. Pause further. Press into the silence. There is something there worth finding. Something there worth trusting. May it rest on us and may we not be too scared to accept it as settles.

subset: commoncrawl


text:
Archive for March 2016
Charming Italian Charm Bracelets
As in connection with their companies, the Languages like German charm bracelets dependant on Italy. Straight away of the girl's introduction until now, informed persons are carrying these folks, even your soccer recognized actors would wear them plus think compared with me as their own personal national outstanding representation plus satisfaction, along in connection with their country's banner. The North western people already have started catching throughout the trend really recently, during most of the late all the twentieth century alongside started wearing them, and after that, became your fashionable and also prevalent accessory for anyone.
The united states of German charm diamond earrings are speedily becoming this particular 'in' organ of the style world combined with being not even exclusively gaining one's own eye from the particular dude population but really the attention with the general gentleman population and then the older and even more mature ladies likewise. These individuals embrace that culture of bracelets without the need of regard that will how old they usually are, their certain race, the Orlando beliefs they have trust in, their connection partner situation or the vicinity they live in. The factor the Italian tongue charm jewels special together with unique when compared to other bracelets purchase is in which links within the bracelets is usually removed furthermore changed to own bracelet a special touch.
Many of the readers may, very well not have got a thought that of a powerful German charisma bracelet would be. The U. k. charm Durant, in really make a difference, is for your normal band whereby comes with an elastic wrist band with holding up the old watches which has metal inbound links where they may be just attached together to create an German charm wedding ring. The standard size the hands down charm rings is 12 links, and virtually all bracelets were regulated for the reason that makers don't want typically the bracelets to research weird in connection with sizes chosen thickness various other bracelets sold in the market.
There are really separate man or woman links that you can buy in stores and retailers nowadays the spot that the customers are able to access links designed to use special picas or possibly photos that is permanently printed within the links or perhaps something customers have the opportunity to choose their particular links and add these to the appeal bracelet for developing it special. The design of your links may vary from at all times photos or merely images youngster should be famous computer animated characters. It at your home for the customers can use can implement to takes advantage of the different link at the bracelet purely only get that inside.
India – Modern Art
Indiana art have been greatly enthused by a rulers. It's led to creation for abundant eye-catching art fashions – just as Mughal and also Rajput varieties. It is mostly a fact how the modern day era for art within India had been initiated from the revivalists. They renewed India's epic past by just depicting Hinduism and also other legends and additionally stories to their alluring art. The work of a lot of artists is made from illustrations with incidents and also scenes from Ramayana, Mahabharata and also other Sanskrit plays authored by Kailas. There are a selection of painters who are able to be it is said the Revivalists about Indian fine art. Raja Ravi Vera can be famous just for bringing American native Indians mythological moments and non-urban life description alive about his canvas. Abanindranath Tagore revealed the faith based past about India thru his succeed. Amanda Coomaraswamy re-energized principle concepts about Indian style. All of these artists have been completely instrumental inside ushering on the new times of modern day art during India.
As said by a lot of modern Musicians and artists "Art will be uglier if you stand amongst two types, not discovering depths about either". Abanindranath's style style can be defined as "expression with out parallel" is by an easy method an extension of her Uncle Raindrop Nat Tagore's' perform which describes inhuman, outstanding shapes, elves along with landscapes for amazing synchronization and additionally balance. Amrita Sheer-Gil is rolling out her personally own style as this wonderful woman has studied simultaneously Indian and additionally Western fine art styles. She gets managed in order to link Native Indian and American art by means of her essential oils which illustrate grave miens and certain amount regarding grief. As your woman once mentioned "On first of all glance various paintings might not exactly seem Indian but also from the accurate sense for the term, their heart is incredibly much Indian".
Modern style in India have been constantly improved by known artists want Jiminy Roy, Amrita Sherrill, Sailor Mukherjee as well as M. Y. Hussain. Hussain's art carries a quality in which expresses the actual humane and also expressive section of fine art. His work is definitely words which supply you with a message. You will find there's galaxy about modern musicians and artists who played a necessary role for revitalizing today's Indian talent scene. A lot of them have really been portrayed right here. Raja Ravi Vera came into this world in 1848 on the state about Kerala inside India and is just about the very widely recognized and shown admiration for names between the first creations of artists by using a western design of work. The exceptional career associated with Raja Ravi Varna is surely an intriguing example with the study with academic fine art in The Indian subcontinent.


text:
Y'know, there's been some good music from us Brits this year, and this is another one. From The Cave are a five piece band from London and this is their new self-titled EP. These guys perform some kind of rock cocktail, taking influences from alternative to grunge to punk to produce something that makes me wanna drink it all up. Mmm, delicious.
The EP kicks things off with Night Hawk which offers a sweet Hawk sample alongside a sketchy guitar riff that's equally moody and catchy, producing the strangest dance moves out of me. From The Cave throw down some sweet male/female vocal dynamics on top of the instrumental which really comes into full swing for the chorus which properly fills up the airwaves. It's a very catchy listen, and definitely gets me in the mood to enjoy the rest of what's to come.
Television features another instrumental that allows the bass to lay down some funky grooves alongside the sketchy guitar riffs, whereas Live Your Life heads down a much heavier route with the band performing some more hard hitting riffs with a chugging momentum that really gets the hips swinging. It's great.
The EP then takes a turn to the sad with the track Trains. This is a drawn out listen that replaces the riffs with some melodies and a whole lot of atmosphere. The vocals are a little softer, and project a pain that makes me want to hug them all so tightly. It's a lovely song which showcases that From The Cave are confident with changing up their sound. This is also the case with the closing track Hope, which sees the band deliver another sound that's full of melodies, hints of piano and all kinds of anthemic moments to bring what has been a very good EP to a close.
From The Cave is a great EP. The band has done a great job at starting it off with the more upbeat and accessible tracks before transitioning it into a record that delivers emotion in the final two tracks. It's full of entertaining guitar riffs, vocal hooks and melodies that make you wanna cry. Let's all hug eachother.
What did you think of From The Cave? Let me know below or via the Exploding Head Syndrome Facebook and Twitter pages.


text:
Do You Need a Motorcycle Accident Attorney in Newport?
Newport Beach is like any city in the nation, motorcycle accidents are increasing in severity each year. As such it means that if you drive a motorcycle it means that you should have the number of a motorcycle accident attorney in Newport. When it comes to a motorcycle crash attorney Newport Beach has a number of options so it can only help to know how a motorcycle accident attorney in Newport can help you.
A motorcyclist has a number of issues that need to be dealt with when it comes to an accident. The cause of the accident must be determined so as to determine who is at fault, and it requires someone who can quickly determine who or even what is at fault. The injuries of all involved must be assessed in order to determine the potential settlement. This is especially important if the lawyer is working on a contingency basis. This means that when researching the accident the motorcycle injury attorney must be thorough, and when it comes a good motorcycle injury lawyer Newport Beach has many resources.
The motorcycle crash attorney Newport can face a number of challenges when it comes to collecting the information given the number of people that can potentially help or hinder his case. He must question any potential witnesses, which can vary depending on the location of the crash; even for a good motorcycle injury attorney Newport Beach has locations that can provide their own difficulties. He must also question any medical or police reports, especially when they contradict each other or witness testimony. Admittedly it is usually a simple process for the lawyer, but in some cases when it comes to research for the motorcycle injury attorney Newport can create its own problems for anyone not used to dealing with the city. It is the combination of experience dealing with the local bureaucracy and knowledge of local law that makes having an attorney worth it.
For those looking for a great motorcycle injury lawyer Newport contact the Law Offices of Jeffrey S. Dawson. Jeff's approach offers a wide variety of options, and it is just a matter of finding one that fits your case. He has a full team devoted to research and investigation and is the perfect motorcycle injury lawyer Newport Beach to settle your case.
equipoise steroid


text:
Action for the River Kennet
Charity information
Action for the River Kennet
The River Kennet is one of England's finest chalk streams, but it is under pressure from abstraction, pollution and population growth. We aim to ensure the survival of the river's distinct chalkstream ecosystem through a combination of direct work on the river, and education and outreach to the community. We run habitat restoration projects, practical volunteering work, classroom education, field studies and open days.
Founded 1990
Mission statement
Action for the River Kennet works to conserve, protect and enhance the River Kennet and its tributaries, at the same time as providing opportunities for people to enjoy and learn about the river.
Established: January 1990
Registered Charity Number: 1120725
Board members: 8
Part time staff: 4
Volunteers: 100
Phone number: 01672 512700
Address: Avebury, Elcot Park, SN8 2BGView charity accounts on the Charity Commission website


text:
Mindfulness is simply a state of being. Many people assume that it requires us to do something, when in fact, it is the art of doing nothing. Nothing but simply being. It is a practice of fully attending to what we're doing and how we're doing it. It seems easy but we often stray from this path and become overwhelmed by other complex areas of life, such as work, school, health, relationships, etc. Over time, our mind begins to wander enough that it creates negative scenarios that haunt us. We lose touch with our intuition and body and become fixated on our past experiences and worry about the future.
The good news:
you most likely know how to be mindful, you simply have to remember how to live mindfully.
We can live mindfully through various forms of meditation. Whether it's while riding the subway, sitting on a comfortable chair, or walking down the street, we can all find our own mindful moments through brief pauses. Through mindful meditation we learn to compassionately understand our inner voice, without judgement, but with warmth and curiosity.
The practice of mindfulness not only helps us get back in touch with our mind and body, it's been scientifically supported to help with:
Although mindfulness has its benefits, it's better to focus on the practice. Many people have reported that they were expecting to feel something throughout meditation. This is often because of the same fixation about the future that leads to stress. Again, mindfulness requires that we bring our attention to the moment at hand. So instead of thinking about the benefits of meditation, simply meditate. By letting go of our preoccupations, we slowly become closer to full awareness. Individuals who are able to achieve this report feeling a sense of calm and a significant reduction in anxiety and stress.
Anyone can do it and it does not require too much alteration of our daily activities. Simply find 5-10 minutes in your day where you can take mindful moment. Read more about mindfulness by clicking here to check out our blog.
Try this quick 5-minute exercise:
Find a comfortable chair or cushion, with your back upright but not tense. Lay your hands on your laps in a comfortable position and slowly take a deep breath in and out, noticing the sensation of the breath as you inhale and exhale. Another deep breath in and out. As you continue to breathe normally, bring your awareness to the sensation of breathing. How about the sensation of sitting? If it helps, use phrases to help you maintain awareness, such as "sit and know you're sitting" or "breath and know you're breathing." Does your shoulders elevate up and down? Does your stomach rise and fall? What is that like? You may experience your mind begin to wander or feel a disrupting bodily sensation, it's alright - take a note of it - and return to the breath. Do this for as little or as long as you'd like, always remembering to return to the breath or the sensation of sitting. For more guided meditation, try meditation apps, such as Headspace, Calm, or 10% Happier.


text:
Saturday, March 21, 2009
When children have panic attacks
how they flip and flop ...
how they overlap one another ...
how they develop artists and writers and feed creativity ...
how they slurp.
Mac still deals with tics from her Tourettes (some days nothing - other days much). She also has lots of other little "things" which like to screw with her day. If you remember, she had what we KNEW was a panic attack several months ago. Yet, the other night, we were finally able to recognize how she truly does have a panic disorder, and how we blame certain episodes on her "stomach" (acid reflux), when in reality she has recurring panic attacks at different levels. As always, the more I learn about her, the more I learn about myself as I reflect on my own issues over the years.
It was easy to nail the one "major" one - she was able to verbalize how she truly thought she was going to die. I always assumed this was the big symptom of a PA (is that the nickname, cause every neurological disorder has to have one?). Yet, on Wednesday night as she called from her friend's house, unable to stay for the sleepover ... as she came into the house and began crying, stating she thought she was going to throw up ... as she begged me to open the windows (it was COLD and she was in spaghetti straps and shorts) ... as she shook uncontrollably ... it all came together for me.
Her stomach doesn't trigger these reactions. Her anxiety triggers all of it, including the acid reflux. Occasionally she might throw up, but rarely. Typically she just hugs the toilet, shakes, sweats (no fever) ... and it subsides within the hour. Like a stomach virus without the virus.
So, we spent all day yesterday practicing belly breathing, imagery, copying relaxation exercises onto her mp3, and reviewing lots of little tricks to curb panic attacks (ie: when you find yourself in an attack and you are focusing on the symptoms, shift your brain to a math problem - like counting backwards by 7's, starting at 100).
She went back to her friend's house and tried it again last night. No phone call at 9:00 pm. She made it! Said her stomach got kinda' bad at one point, but she just needed to burp. :)
11 comments:
- Sara said...
I am both sad and glad that you have the skills and thought to teach her how to stay in control. *hugs*
- March 21, 2009 7:57 PM
- Story of our Life said...
Bless her little heart. I'm so happy for her that she was able to go back to her friends house for the sleep-over. What a huge step for her and something she should be proud of and you, also.
What a great mommy she has to help her with these things!
- March 21, 2009 9:10 PM
- T & T Livesay said...
sic em bears
- March 21, 2009 9:47 PM
- Kristen said...
I am so sorry she is dealing with this! I've had my share of PA - not fun times. She is so lucky that you "get it".
- March 22, 2009 2:22 AM
- Recovering Noah said...
Hey Mac! Can you come over here and teach your boyfriend Eli how to calm himself down? ;-)
Hope you have a great week! (You, too, Christine. lol)
- March 22, 2009 5:01 PM
- Parkerchica said...
Sigh. I love this baby. I'm so glad she was finally able to enjoy the sleepover.
- March 22, 2009 11:58 PM
- Hannah_Rae said...
Thanks so much for your sweet comment. Doesn't he just shine "great kid"?!?!? I think so. :)
Where can you find downloadable relaxation techniques? This may come in handy later.
I am so glad you have found the source for the tummy aches. I hope Twitchy Mac can keep getting better and better at controlling them.
- March 23, 2009 11:34 AM
- curlyjo said...
Hmmm...My M complains of tummy aches all the time. She says she feels like she has to throw up. She cries at bedtime, because she's afraid of tornados!?! Anxiety perhaps....curious!?
- March 24, 2009 8:57 PM
- Christine said...
curlyjo, sounds a lot like the things Mac dealt with in the early days. She does have acid reflux, but we've finally discovered the anxiety gets the acid to boiling.
When I taught the kids how to exit through their bedroom window in case of fire (part of our safety plan during our foster care training), she went into a three-day freak out.
You can start to work with her in little ways. The belly breathing is GREAT, and pretty much anyone can do it. Also, we like to write down or draw pictures of the "scaries" ... then rip them up, burn 'em, tear 'em up (whatever) and redraw or write the truth. This is a basic concept in Cognitive Behavior Therapy that you can do at home in a way your child can understand. Might turn from a drawing of a fire to a drawing of all of our safe wiring in the house, our safety plans, and God giving us a big hug as He cares for us.
Hannah, check out www.drmikemiller.com, the "Self-Help" section. I have also googled stuff like "relaxation downloads" to find free stuff online.
- March 24, 2009 9:05 PM
- Amy T. S. said...
Have you tried this nifty imagery? Assign a shape to your feeling - say a jagged-edged shape, and then imagine that shape changing into something different - like a soft cloud shape or something. I tried it in labor but went for the epidural instead, though, so maybe it doesn't work. I've used it for headaches with some success.
- March 25, 2009 11:02 PM
- May 29, 2009 2:00 AM


text:
Re-posted snippet from the Knight Foundation article:
We didn't know what to expect when we launched our third Knight Cities Challenge last fall. The response in the first two years was phenomenal; from a total pool of more than 12,000 applications we have named fewer than 70 winning projects. We wondered if civic innovators would bring that same enthusiasm to this round. There is no question that they did that—and more.
This time we received more than 4,500 applications responding to the question, What's your best idea to make cities more successful? The number even surpassed the applications we received in 2015. Now, 144 finalists will move forward to the next phase of our national call for ideas to make the 26 Knight communities more successful.
The ideas all focus on one or more of the three drivers of city success: talent, opportunity and engagement. There is at least one finalist in each of the 26 Knight communities, along with several projects that would be put to work in multiple cities.
Detroit and Philadelphia once again top the list of finalists, with 21 and 20 proposals respectively, on par with last year, but there are great ideas in the mix from all of the Knight communities, representing the breadth of our country, from San Jose, California, represented with eight projects, to Charlotte, North Carolina, with 12, and every Knight community between.
We're looking forward to diving into the details. The finalists have until the end of January to submit full applications, which will include budgets, letters of recommendation, renderings and other material, for the next stage of our review process, which includes reviewers from Knight communities as well as national experts. We'll submit the list of final recommended projects to Knight's board of trustees later this year, and we'll announce the winners in the spring.
Congratulations to the finalists, and thank you to everyone who submitted an idea. We look forward to your being a part of Knight's national network of civic innovators, and we look forward to connecting with you in your city. We can learn from your ideas and your commitment, and we will share what we learn from these experiments with you.
Thanks also to our team of reviewers, to those who helped select the finalists and to those joining us in exploring the 144 full applications. We can't wait to review the final submissions, and to announce the winning ideas in spring 2017.
Charlotte, North Carolina:
The Imagine Forest by City of Charlotte (submitted by Eugene Bradley): Creating a space where people can connect by transforming a cove along the Sugar Creek Greenway in the Belmont neighborhood of Charlotte into a natural playground, with paths, trees and other ways to connect with the environment.
Activest by Activest (submitted by Ryan Bowers): Fostering more responsive ways of governing by actively engaging city leaders and city bondholders in dialogue about social practices and policies.
Charlotte Neighborhood Waypoints (submitted by Idara Umoren): Connecting residents to each other and their city by installing wayfinding signage in high pedestrian traffic areas that encourage conversation, community connection and exploration.
Civics Charlotte (submitted by Joshua C. Richardson): Increasing civic engagement through a program that educates people on the law, politics and economics that shape their local area.
Dine With Me CLT by Familiar Workshop (submitted by Katie Lloyd): Fostering community engagement and strengthening neighborhood pride by creating spaces that encourage dialogue between residents through shared meals and storytelling.
Early Voter Poll Party by City of Charlotte (submitted by John Short): Increasing voter turnout and civic engagement by providing entertainment, food trucks and more at early voting polling places.
Neighborhood SparKit by City of Charlotte (submitted by Monica Carney Holmes): Inspiring neighborhoods to rethink community meetings and events by providing a ready-made low-cost kit that includes tools and instructions for reenergizing these gatherings. For example, residents can transform the setting of their neighborhood meeting into a Parisian bistro, or host a pop-up playground or outdoor movie night.
Queen City Live! by Charlotte Center City Partners (submitted by Erin Gillespie): Bringing people together and improving neighborhood life with mobile stages that feature built-in instruments and open opportunities for live performances and spontaneous jam sessions.
Rail Trail Connection by Charlotte Center City Partners (submitted by Erin Gillespie): Encouraging economic development and city vibrancy by creating a lively place to connect with nature and neighbors along Charlotte's light rail line. The space will also help link a retail employment center to the nearest transit stop.
Your Move, Charlotte (submitted by Varian Shrum and Garrett Tichy): Strengthening connections between citizens and local government through a weekly podcast and follow-up roundtable, in which government representatives and millennials engage on local issues.
The ZIP Code Project by Queen City Forward (submitted by Amy Chiou): Increasing community attachment, especially for newcomers, by engaging the city's creatives to use art and placemaking to share what people love about their ZIP codes. For example, creating a T-shirt with a photograph of an iconic local restaurant and the ZIP code on the sleeve.
Work in the Park! (submitted by Siana Campbell): Promoting innovation and collaboration in Charlotte by transforming city parks into spaces that encourage residents to take work to the park.
View the full article from the Knight Foundation posted on January 17, 2017 by George Abbott here.


text:
the complete gucci spring campaign starring joan smalls
by Jeremy Danté
what yo' name iz? joan smalls, karmen pedaru, hailey clauson, nikola jovanovic
not many feats in the fashion industry can make me gasp, but joan smalls is one model that has me on the edge of my seat every step of the way. through the lens of mert + marcus, joan smalls appears in this slight preview alongside karmen pedaru for the spring 2011 gucci campaign. you may recall seeing joan appear alongside raquel zimmermann for the gucci pre-fall 2010 campaign; & now it seems as though ms. smalls has become a certified gucci girl. seen printed in the february issue of british elle, this is our first look at the new campaign images. im completely overjoyed to see that joan has been successfully embraced in the world of high end fashion. along with her recent contract signing with estee lauder & now this, 2011 is shaping up to be the year of joan smalls. represented by IMG, joan appears along side karmen pedaru of ford. though not seen here, speculation leads me to believe that hailey clauson of marilyn management was shot for this campaign as well, granted she walked the runway for the house of gucci for the SS11 show season in milan. male model, nikola jovanovic of ford models is seen along with karmen & joan for this season as well, proving him to be a gucci guy fave. joan is stunning!!
imagesource | tfs