Статьи

Создание приложения со списком Todo с использованием Node.js и Express.js в Visual Studio

Некоторые из вас, возможно, были удивлены, увидев заголовок, содержащий Node, Express и Visual Studio вместе. Да, можно создавать приложения Node.js в Visual Studio. В случае, если вы не знаете, Visual Studio также имеет расширение для разработки приложений Python, вам нужно установить  PTVS (Python Tools for Visual Studio),  чтобы иметь возможность это сделать. Команда, которая разработала PTVS, также разработала  NTVS (инструменты Node.js для Visual Studio)  с помощью пары людей из сообщества. NTVS является открытым исходным кодом с самого начала и принимает участие сообщества. Проект все еще находится в бета-версии, поэтому у него есть некоторые болевые точки, но он все еще работает довольно хорошо. Чтобы следовать этому посту, скачайте и установите расширение со своего  сайта codeplex., Он работает с версиями Visual Studio 2012 и 2013 годов.

После установки NTVS запустите Visual Studio и выберите «Файл» -> «Создать» -> «Проект». В диалоговом окне разверните узел Другие языки и укажите узел JavaScript под этим. Вы увидите новую опцию Node.js, добавленную здесь. В этом разделе вы найдете несколько шаблонов проектов для начала разработки приложений Node.js.

Если у вас установлен  TypeScript  , вы также найдете тот же набор шаблонов в узле TypeScript. 

Давайте начнем создавать простое приложение со списком Todo с использованием NTVS. В новом диалоговом окне проекта выберите Blank Express Application, измените имя приложения на Express-Todo и нажмите OK. 

Новый проект, который мы только что создали, полностью подготовлен для разработки приложения Node — Express. В проекте установлены следующие пакеты NPM; вы можете найти их под узлом npm в Solution Explorer. Express — это облегченный серверный фреймворк для разработки приложений Node.js. Jade — самый популярный движок для просмотра страниц, используемый в экспрессе. Стилус определяет способ написания CSS, устраняет многие болевые точки написания CSS. 

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

app.set('port', process.env.PORT || 3000);  //Port number configured for the application
app.set('views', path.join(__dirname, 'views'));  //Folder under which the view files are stored
app.set('view engine', 'jade');  //Configuring view engine so that express parses them before rendering
app.use(express.favicon());  //Invoking favicon on startup
app.use(express.logger('dev')); 
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(app.router);
app.use(require('stylus').middleware(path.join(__dirname, 'public')));  //Stylus middleware invocation
app.use(express.static(path.join(__dirname, 'public')));  //Defining relative path for static files

Теперь запустите приложение. Вы должны быть в состоянии увидеть простой вид «Привет, мир» в браузере. 

Нам нужен еще один пакет NPM, underscore.js. Это может быть установлено двумя способами. Одним из них является использование диалога, предлагаемого NTVS, или использование команды npm в командной строке. Давайте использовать диалог GUI для установки пакета. Щелкните правой кнопкой мыши узел NPM и выберите «Управление модулями npm…». Перейдите на вкладку «Поиск в репозитории npm» и введите подчеркивание. Выберите пакет, выделенный на скриншоте, и нажмите «Установить локально». Этот шаг добавляет пакет в проект и добавляет запись подчеркивания в package.json. Проверьте содержимое под узлом npm, вы должны увидеть там подчеркивание пакета. 

Добавьте новый файл JavaScript в папку маршрутов и назовите его todos.js. Этот файл будет содержать службу API для отображения и добавления элементов задач в коллекцию в памяти. Ниже приведен код в файле: 

var _ = require('underscore');
 
var listItems =
[
    {
        "id": 1,
        "text": "Get Up"
    },
    {
        "id": 2,
        "text": "Brush teeth"
    },
    {
        "id": 3,
        "text": "Get Milk"
    },
    {
        "id": 4,
        "text": "Prepare coffee"
    },
    {
        "id": 5,
        "text": "Have a hot cup of coffee"
    }
];
 
exports.list = function(req, res){    
    res.send(listItems);
};
 
exports.addToList = function (req, res) {
    var maxId = _.max(listItems, function (item) { return item.id });
    console.log(maxId);
    var newTodoItem = { "id": maxId.id + 1, "text": req.body.text };
    listItems.push(newTodoItem);
    res.send({ success: true, item: newTodoItem });
};

Я использовал подчеркивание для вычисления следующего идентификатора элемента todo. Чтобы использовать подчеркивание, нам нужно добавить объявление require в начале файла, оно похоже на операторы using в файлах кода C #. Все участники, которые будут представлены внешнему миру, должны быть добавлены к объекту экспорта. 

Чтобы представить вышеупомянутые методы как API, нам нужно определить метод HTTP и присоединить к ним путь маршрута. В файле app.js добавьте следующий оператор вверху:

var todos = require('./routes/todos');

Это утверждение возвращает объект модуля, предоставляемый файлом todos.js. Теперь все, что нам нужно сделать, это определить маршруты, они выполняются следующим образом:

app.get('/api/todos', todos.list);
app.post('/api/todos', todos.addToList);

Это довольно легко, не так ли? С этим мы закончили работу на стороне сервера. Давайте определим компоненты на стороне клиента. Для начала давайте добавим jQuery на страницу макета. Вы можете установить пакет с помощью Bower и использовать его, или вы также можете указать CDN. Давайте использовать путь CDN Google для ссылки на jQuery. Ниже приводится тег Jade, который делает это: 

script(src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js")

Теперь давайте обновим файл index.jade, чтобы он содержал элементы списка. Ниже приведена разметка измененного файла index.jade:

extends layout
 
block content
  h1= title
  p Welcome to #{title}
  ul(id="todoList")
  br
  br
  input(type="text" id="txtNewTodo")
  button(id="btnAddTodo") Add New Todo
  script(src="/javascripts/todoOperations.js")

Как видите, в jade для определения тегов не требуются угловые скобки. Он понимает вложение через отступ. Для отступа тегов можно использовать пробелы или символы табуляции; но не оба. Нам еще предстоит определить файл todoOperations.js, упомянутый выше. Давай сделаем это сейчас. Добавьте файл JavaScript в папку javascripts в общей папке и назовите его todoOperations.js. Код в этом файле довольно прост, если вы знаете jQuery. 

var todoOperations = function () {
    var todos;
 
    function getAllTodos() {
        //var deferred=$.defer();
 
        return $.get("/api/todos", function (data) {
            todos = data;
        });
    }
 
    function addTodo(todoItem) {
        return $.post('/api/todos', todoItem);
    }
 
    return {
        getAllTodos: getAllTodos,
        addTodo: addTodo
    }
}();
 
var list;
 
function refreshTodos() {
    todoOperations.getAllTodos().then(function (data) {
        $.each(data, function () {
            list.append("<li data-id='" + this.id + "'>" + this.text + "</li>");
        });
    });
}
 
$(function () {
    list = $("#todoList");
 
    $("#btnAddTodo").click(function () {
        var textBox = $("#txtNewTodo");
        if (textBox.val() !== "") {
            todoOperations.addTodo({ "text": textBox.val() }).then(function (data) {
                if (data.success === true) {
                    list.append("<li data-id='" + data.item.id + "'>" + data.item.text + "</li>");
                    textBox.val('');
                }
            });
        }
    });
 
    refreshTodos();
});

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

 


Чтобы обновить и удалить элементы todo, вам нужно определить методы в файле todos, js и добавить маршруты для них в файл app.js, используя методы app.put и app.delete.
Я оставляю это как упражнение для вас ?

Удачного кодирования!