Часть 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);
});

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