Часть 5 - Простое программирование
В этой серии статей мы исследуем не то, что мы можем сделать с бессерверными платформами приложений, а то, что нам больше не нужно делать.
Предыдущие части:
В частях 1, 2, 3 и 4 мы выбрали платформу, операционную систему, язык программирования и базу данных для нашей серверной части, и мы установили все необходимое для запуска нашего кода. На этот раз мы на самом деле напишем этот код.
Вернуться к доске для рисования
Сейчас хорошее время, чтобы сосредоточиться на том, что мы на самом деле строим, потому что теперь у нас, наконец, есть место для этого. Это простой сервис с четкими требованиями, который, как и большинство простых вещей, довольно скоро станет сложным до неузнаваемости. Но сейчас это все еще просто. Нам нужно создать веб-сайт, на котором будут отображаться новости. Эти новости будут меняться, они динамические, поэтому нам нужен бэкэнд для подачи свежих новостей в наш интерфейс.
Новости будут иметь заголовок, автор, содержание и дату публикации. Мы не ожидаем, что нам потребуются дополнительные данные, то есть неожиданные данные нам понадобятся позже, но не сейчас.
Нам нужен простой сборник новостей в базе данных. Мы запускаем оболочку Mongo, затем создаем новую базу данных «backendera» и создаем нового пользователя с доступом только для чтения с синтаксисом оболочка Mongo, которую мы скоро запомним:
db.createUser({ user: "newsreader", pwd: "secure1", roles: [{role: "read", db: "backendera"}] });
В этой базе данных мы создаем новую коллекцию, которую мы называем «новостями»:
db.createCollection('news');
И мы вставляем три новости:
db.news.insert({ title: "News1", author: "Author1", content: "This is news number 1", date: new Date() }); db.news.insert({ title: "News2", author: "Author2", content: "This is news number 2", date: new Date() }); db.news.insert({ title: "News3", author: "Author3", content: "This is news number 3", date: new Date() });
Убедившись, что у нас есть правильные данные в правильной коллекции, мы можем закрыть оболочку Mongo и начать кодирование нашей серверной части.
Мы создаем новый проект узла с помощью npm и устанавливаем модуль mongodb. Остальные варианты: mongo, mongojs, mongo-native, mongoose и некоторые другие. Но после тщательного изучения всех плюсов и минусов этих модулей, допустим, мы решили перейти на mongodb.
Установка завершается неудачно, но вскоре мы понимаем, что «фатальная ошибка: gssapi / gssapi.h: нет такого файла или каталога», конечно же, означает, что нам необходимо установите системный пакет libkrb5-dev. Мы пытаемся установить его снова, и он работает как шарм. Мы можем начать кодирование прямо сейчас. Наконец-то.
Итак, мы начинаем наш app.js с:
var mongo = require('mongodb').MongoClient; var url = 'mongodb://newsreader:secure1@localhost:27017/backendera';
а во второй строке мы понимаем, что не можем иметь жестко закодированный пароль в исходном файле, как этот, поэтому нам нужно подумать о некоторых настройках файлов, прежде чем запустить его в производство. К счастью, сейчас мы только разрабатываем на нашем локальном компьютере, поэтому пока не будем об этом беспокоиться, но это мы должны помнить.
Затем мы установим экспресс-модуль, чтобы создать HTTP-сервер для нашего API. Опять же, есть много разных способов сделать это без экспресс-обработки - с помощью http, connect, koa, hapi , паруса и многие другие. Мы читаем обо всех из них, а затем, допустим, по какой-то причине выбираем экспресс. Это еще одно «скажем так», которое нужно добавить в коллекцию, но мы должны что-то выбрать, так почему бы не выразить.
На этот раз экспресс-установка будет чистой, и мы сможем создать наш сервер. Итак, мы пишем простое экспресс-приложение, которое подключается к Mongo и прослушивает входящие HTTP-подключения через порт 3030:
var mongo = require('mongodb').MongoClient; var express = require('express'); // XXX: FIXME: NOTE TO SELF: MAKE IT SECURE LATER var dbUrl = 'mongodb://newsreader:secure1@localhost:27017/backendera'; mongo.connect(dbUrl, function (err, db) { if (err) throw err; var news = db.collection('news'); var app = express(); app.get('/news', function (req, res) { news.find({}).toArray(function (err, array) { if (err) { res.sendStatus(500); } else { res.json(array); } }); }); app.listen(3030); });
И это работает. Это было довольно просто. Почти слишком легко. Чем больше мы об этом думаем, тем больше потенциальных проблем мы начнем видеть. Мы остановимся на них в следующей части.