Статьи

Создание веб-приложений Node.js с использованием службы таблиц Windows Azure

Примечание куратора: этот учебник изначально появился на WindowsAzure.com .

В этом руководстве показано, как использовать службу таблиц, предоставляемую Windows Azure Data Management, для хранения и доступа к данным из приложения узла, размещенного на веб-сайте Windows Azure. В этом руководстве предполагается, что у вас есть некоторый опыт использования узлов и Git .

Ты выучишь:

  • Как использовать npm (менеджер пакетов узлов) для установки модулей узлов

  • Как работать со службой Windows Azure Table

  • Как использовать средство командной строки Windows Azure для Mac и Linux для создания веб-сайта Windows Azure

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

Файлы проекта для этого учебника будут храниться в каталоге с именем tasklist, и завершенное приложение будет выглядеть примерно так:

Веб-страница с пустым списком задач

Примечание . В этом руководстве содержится ссылка на папку списка задач . Полный путь к этой папке не указан, так как семантика пути различается в разных операционных системах. Вам следует создать эту папку в месте, к которому вам будет легко получить доступ в локальной файловой системе, например ~ / node / tasklist или c: \ node \ tasklist

Примечание . Во многих шагах, приведенных ниже, упоминается использование командной строки. Для этих шагов используйте командную строку для вашей операционной системы, например, cmd.exe (Windows) или Bash (Unix Shell). В системах OS X вы можете получить доступ к командной строке через приложение терминала.

Предпосылки

Прежде чем следовать инструкциям в этой статье, убедитесь, что у вас установлено следующее:

  • последняя версия узла

  • Гит

  • Текстовый редактор

  • Веб-браузер

Заметка

Чтобы выполнить это руководство, вам нужна учетная запись Windows Azure с включенной функцией веб-сайтов Windows Azure. Вы можете создать бесплатную пробную учетную запись и включить функции предварительного просмотра всего за пару минут. Подробности см. В разделе « Создание учетной записи Windows Azure и включение функций предварительного просмотра» .

 

Создать учетную запись хранения

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

  1. Откройте веб-браузер и перейдите на портал Windows Azure . При появлении запроса войдите в систему, используя информацию о подписке Windows Azure

  2. В нижней части портала нажмите + NEW и выберите Учетная запись хранения .

    + новый

    учетная запись хранения

  3. Выберите « Быстрое создание» , а затем введите URL-адрес и регион / сходство для этой учетной записи хранения. Поскольку это учебное пособие, и его не нужно реплицировать глобально, снимите флажок Включить гео-репликацию . Наконец, нажмите «Создать учетную запись хранения».

    быстро создать

    Запишите введенный вами URL-адрес, так как на последующих шагах на него будет ссылаться имя учетной записи.

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

    ключи доступа

Установите модули и создайте леса

В этом разделе вы создадите новое приложение Node и будете использовать npm для добавления пакетов модулей. Для приложения со списком задач вы будете использовать модули Express и Azure . Модуль Express предоставляет платформу Model View Controller для узла, а модули Azure обеспечивают подключение к службе таблиц.

Установите экспресс и создайте леса

  1. Из командной строки измените каталоги на каталог списка задач . Если каталог списка задач не существует, создайте его.

  2. Введите следующую команду, чтобы установить экспресс.

npm install express -g

Примечание . При использовании параметра ‘-g’ в некоторых операционных системах вы можете получить сообщение об ошибке Error: EPERM, chmod ‘/ usr / local / bin / express’ и запрос на попытку запуска учетной записи от имени администратора. Если это происходит, используйте команду sudo для запуска npm с более высоким уровнем привилегий.

Вывод этой команды должен выглядеть примерно так:

express@2.5.9 /usr/local/lib/node_modules/express
├── mime@1.2.4
├── mkdirp@0.3.0
├── qs@0.4.2
└── connect@1.8.7

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

To create the scaffolding which will be used for this application, use the express command:

express

The output of this command should appear similar to the following:

create : .
    create : ./package.json
    create : ./app.js
    create : ./public
    create : ./public/javascripts
    create : ./public/images
    create : ./public/stylesheets
    create : ./public/stylesheets/style.css
    create : ./routes
    create : ./routes/index.js
    create : ./views
    create : ./views/layout.jade
    create : ./views/index.jade

    dont forget to install dependencies:
    $ cd . && npm install

After this command completes, you should have several new directories and files in the **tasklist** directory.

Install additional modules

The package.json file is one of the files created by the express command. This file contains a list of additional modules that are required for this application. For this tutorial, we will be using the following additional modules:

  • azure — provides access to Windows Azure features such as the Table service

  • node-uuid — creates unique identifiers

  • async — functions for asynchronous JavaScript

To add a requirement for additional modules used in this tutorial, perform the following steps:

  1. Open the package.json file in a text editor.

  2. Find the line that contains «jade»: . Add a new line after it, which should contain the following:

, "azure": ">= 0.5.3"
, "node-uuid": ">= 1.3.3"
, "async": ">= 0.1.18"

After this change, the file contents should appear similar to the following:

{
"name": "application-name"
  , "version": "0.0.1"
  , "private": true
  , "dependencies": {
      "express": "2.5.8"
    , "jade": ">= 0.0.1"
    , "azure": ">= 0.5.3"
    , "node-uuid": ">= 1.3.3"
    , "async": ">= 0.1.18"
  }
}
  1. Save the package.json file.

  2. From the command-line, change directories to the tasklist folder and enter the following to install the modules described in the package.json file:

npm install

The output of this command should appear as follows:

async@0.1.18 ./node_modules/async
node-uuid@1.3.3 ./node_modules/node-uuid
jade@0.26.0 ./node_modules/jade
├── commander@0.5.2
└── mkdirp@0.3.0
express@2.5.8 ./node_modules/express
├── qs@0.4.2
├── mime@1.2.4
├── mkdirp@0.3.0
└── connect@1.8.7
azure@0.5.3 ./node_modules/azure
├── dateformat@1.0.2-1.2.3
├── xmlbuilder@0.3.1
├── log@1.3.0
├── node-uuid@1.2.0
├── xml2js@0.1.14
├── mime@1.2.5
├── underscore@1.3.3
├── qs@0.5.0
├── underscore.string@2.2.0rc
└── sax@0.4.0

Using the Table service in a node application

In this section you will extend the basic application created by the express command by adding a task.js file which contains the model for your tasks. You will also modify the existing app.js and create a new tasklist.js file that uses the model.

Create the model

  1. In the tasklist directory, create a new directory named models.

  2. In the models directory, create a new file named task.js. This file will contain the model for the tasks created by your application.

  3. At the beginning of the task.js file, add the following code to reference required libraries:

var azure = require('azure')
  , uuid = require('node-uuid');

Next, you will add code to define and export the Task object. This object is responsible for connecting to the table.

module.exports = Task;


function Task(storageClient, tableName, partitionKey) {
  this.storageClient = storageClient;
  this.tableName = tableName;
  this.partitionKey = partitionKey;


  this.storageClient.createTableIfNotExists(tableName, 
    function tableCreated(err) {
      if(err) {
        throw error;
      }
    });
};

Next, add the following code to define additional methods on the Task object, which allow interactions with data stored in the table:

Task.prototype = {
  find: function(query, callback) {
    self = this;
    self.storageClient.queryEntities(query, 
      function entitiesQueried(err, entities){
        if(err) {
          callback(err);
        } else {
          callback(null, entities);
        }
      });
  },


  addItem: function(item, callback) {
    self = this;
    item.RowKey = uuid();
    item.PartitionKey = self.partitionKey;
    item.completed = false;
    self.storageClient.insertEntity(self.tableName, item, 
      function entityInserted(error) {
        if(error){  
          callback(err);
        }
        callback(null);
      });
  },


  updateItem: function(item, callback) {
    self = this;
    self.storageClient.queryEntity(self.tableName, self.partitionKey, item,
      function entityQueried(err, entity) {
       if(err) {
          callback(err);
        }
        entity.completed = true;
        self.storageClient.updateEntity(self.tableName, entity,
          function entityUpdated(err) {
            if(err) {
              callback(err);
            }
            callback(null);
          });
      });
  }
}
  1. Сохраните и закройте файл task.js.

Создать контроллер

  1. В каталоге tasklist / маршруты создайте новый файл с именем tasklist.js и откройте его в текстовом редакторе.

  2. Добавьте следующий код в tasklist.js . Это загружает модули azure и async, которые используются tasklist.js . Это также определяет функцию TaskList , которой передается экземпляр объекта Task, который мы определили ранее:

var azure = require('azure')
  , async = require('async');


module.exports = TaskList;


function TaskList(task) {
  this.task = task;
}

Продолжайте добавлять к tasklist.js файла путем добавления методов , используемых для showTasks , AddTask и completeTasks :

TaskList.prototype = {
  showTasks: function(req, res) {
    self = this;
    var query = azure.TableQuery
      .select()
      .from(self.task.tableName)
      .where('completed eq ?', 'false');
    self.task.find(query, function itemsFound(err, items) {
      res.render('index',{title: 'My ToDo List ', tasks: items});
    });
  },


  addTask: function(req,res) {
    var self = this      
    var item = req.body.item;
    self.task.addItem(item, function itemAdded(err) {
      if(err) {
        throw err;
      }
      res.redirect('home');
    });
  },


  completeTask: function(req,res) {
    var self = this;
    var completedTasks = Object.keys(req.body);
    async.forEach(completedTasks, function taskIterator(completedTask, callback){
      self.task.updateItem(completedTask, function itemsUpdated(err){
        if(err){
          callback(err);
        } else {
          callback(null);
        }
      })
    }, function(err){
      if(err) {
        throw err;
      } else {
       res.redirect('home');
      }
    });
  }
}
  1. Сохраните файл tasklist.js .

Изменить app.js

  1. В каталоге списка задач откройте файл app.js в текстовом редакторе. Этот файл был создан ранее с помощью команды express .

  2. В начале файла добавьте следующее, чтобы загрузить модуль Azure, задайте имя таблицы, partitionKey и установите учетные данные хранилища, используемые в этом примере:

var azure = require('azure');
var tableName = 'tasks'
  , partitionKey = 'partition'
  , accountName = 'accountName'
  , accountKey = 'accountKey';

Примечание . Вы должны заменить значения «accountName» и «accountKey» на значения, полученные ранее при создании учетной записи хранения Windows Azure.

Замените содержимое после комментария // Routes следующим кодом. Это инициализирует экземпляр Task с подключением к вашей учетной записи хранения. Затем это пароль для TaskList , который будет использовать его для связи со службой таблиц:

var TaskList = require('./routes/tasklist');
var Task = require('./models/tasks.js');
var task = new Task(
    azure.createTableService(accountName, accountKey)
    , tableName
    , partitionKey);
var taskList = new TaskList(task);


app.get('/', taskList.showTasks.bind(taskList));
    app.post('/addtask', taskList.addTask.bind(taskList));
    app.post('/completetask', taskList.completeTask.bind(taskList));


app.listen(process.env.port || 1337);
  1. Сохраните файл app.js.

Изменить представление индекса

  1. Перейдите в каталог views и откройте файл index.jade в текстовом редакторе.

  2. Замените содержимое файла index.jade приведенным ниже кодом. Это определяет представление для отображения существующих задач, а также форму для добавления новых задач и маркировки существующих как выполненных.

h1= title
  font(color="grey") (powered by Node.js and Windows Azure Table Service)
form(action="/completetask", method="post")
  table(border="1")
    tr
      td Name
      td Category
      td Date
      td Complete
    each task in tasks
      tr
        td #{task.name}
        td #{task.category}
        - var day   = task.Timestamp.getDate();
        - var month = task.Timestamp.getMonth() + 1;
        - var year  = task.Timestamp.getFullYear();
        td #{month + "/" + day + "/" + year}
       td
         input(type="checkbox", name="#{task.RowKey}", value="#{!task.itemCompleted}", checked=task.itemCompleted)
  input(type="submit", value="Update tasks")
hr
form(action="/addtask", method="post")
  table(border="1") 
    tr
      td Item Name: 
      td 
        input(name="item[name]", type="textbox")
    tr
      td Item Category: 
      td 
        input(name="item[category]", type="textbox")
  input(type="submit", value="Add item")
  1. Сохраните и закройте файл index.jade .

Запустите ваше приложение локально

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

  1. Из командной строки измените каталоги на каталог списка задач .

  2. Используйте следующую команду для локального запуска приложения:

node app.js
  1. Откройте веб-браузер и перейдите к http://127.0.0.1:1337. Это должно отобразить веб-страницу, похожую на следующую:

    Веб-страница с пустым списком задач

  2. Используйте предусмотренные поля для имени элемента и элемент категории для ввода информации, а затем нажмите кнопку Добавить элемент .

  3. Страница должна обновиться для отображения элемента в таблице ToDo List.

    Изображение нового элемента в списке задач

  4. Чтобы выполнить задачу, просто установите флажок в столбце «Завершить» и нажмите « Обновить задачи» .

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

Разверните свое приложение в Windows Azure

Шаги в этом разделе используют инструменты командной строки Windows Azure для создания нового веб-сайта Windows Azure, а затем используют Git для развертывания приложения. Для выполнения этих шагов у вас должна быть подписка Windows Azure. Если у вас еще нет подписки, вы можете подписаться на нее бесплатно .

Примечание . Эти шаги также можно выполнить с помощью портала Windows Azure. Инструкции по использованию портала Windows Azure для развертывания приложения Node.js см. В разделе « Создание и развертывание приложения Node.js на веб-сайте Windows Azure» .

Примечание . Если это первый созданный вами веб-сайт Windows Azure, вы должны использовать портал Windows Azure для развертывания этого приложения.

Установите средство командной строки Windows Azure для Mac и Linux

Чтобы установить инструменты командной строки, используйте следующую команду:

npm install azure -g

Примечание . Если вы уже установили Windows Azure SDK для Node.js из Центра разработчиков Windows Azure , то инструменты командной строки уже должны быть установлены. Для получения дополнительной информации см. Средство командной строки Windows Azure для Mac и Linux .

Примечание . Хотя инструменты командной строки были созданы в основном для пользователей Mac и Linux, они основаны на Node.js и должны работать на любой системе, способной работать на Node.

Импорт настроек публикации

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

  1. Из командной строки измените каталоги на каталог списка задач .

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

azure account download

Загрузка файла должна начаться автоматически; если это не так, вы можете нажать на ссылку в начале страницы, чтобы загрузить файл вручную.

После завершения загрузки файла используйте следующую команду для импорта настроек:

azure account import <path-to-file>
  1. Укажите путь и имя файла настроек публикации, загруженного на предыдущем шаге. После завершения команды вы должны увидеть вывод, подобный следующему:

    ! [Вывод команды импорта] [import-publishing-settings]

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

Создать веб-сайт Windows Azure

  1. Из командной строки измените каталоги на каталог списка задач .

  2. Используйте следующую команду для создания нового веб-сайта Windows Azure.

azure site create --git

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

Параметр —git создаст Git-репозиторий в Windows Azure для этого веб-сайта. Он также инициализирует Git-репозиторий в текущем каталоге, если он не существует. Он также создаст Git remote с именем «azure», который будет использоваться для публикации приложения в Windows Azure. Наконец, он создаст файл web.config , который содержит параметры, используемые Windows Azure для размещения приложений узла.

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

Примечание . Если параметр —git опущен, но в каталоге есть репозиторий Git, удаленный сервер Azure все равно будет создан.

После выполнения этой команды вы увидите вывод, подобный следующему. Обратите внимание, что строка, начинающаяся с веб-сайта, созданного в, содержит URL-адрес веб-сайта.

info:   Executing command site create
help:   Need a site name
Name: TableTasklist
info:   Using location southcentraluswebspace
info:   Executing `git init`
info:   Creating default .gitignore file
info:   Creating a new web site
info:   Created website at  tabletasklist.azurewebsites.net
info:   Initializing repository
info:   Repository initialized
info:   Executing `git remote add azure https://username@tabletasklist.azurewebsites.net/TableTasklist.git`
info:   site create command OK

Note: If this is the first Windows Azure Web Site for your subscription, you will be instructed to use the portal to create the web site. For more information, see Create and deploy a Node.js application to a Windows Azure Web Site.

Publish the application

  1. In the Terminal window, change directories to the tasklist directory if you are not already there.

  2. Use the following commands to add, and then commit files to the local Git repository:

git add .
git commit -m "adding files"

When pushing the latest Git repository changes to the Windows Azure Web Site, you must specify that the target branch is master as this is used for the web site content.

git push azure master

At the end of the deployment, you should see a statement similar to the following:

To https://username@tabletasklist.azurewebsites.net/TableTasklist.git
 * [new branch]      master -> master
  1. Once the push operation has completed, browse to the web site URL returned previously by the azure create site command to view your application.

Next steps

While the steps in this article describe using the Table Service to store information, you can also use MongoDB. See Node.js Web Application with MongoDB for more information.

Additional resources

Windows Azure command-line tool for Mac and Linux