
Сегодня мы с вами разберем как подключать базу данных к нашему API.
В качестве базы данных мы будем с вами использовать mongodb. Почему именно ее? Это самая популярная из документ-ориентированных баз данных к ней есть много библиотек и она широко распространена.
Для установки mongodb на любой из платформ заходите на https://www.mongodb.com/download-center и качаете нужную вам версию.
Для macosx можно не качать напрямую а установить с помощью brew
brew install mongodb
После установки для пуска mongodb сервера достаточно написать в консоли mongod. Нужно помнить, что база данных запущена только пока этот процесс висит. Если вы остановите его нажам ctrl+c или command+c, то база работать не будет. Так что мы должны запускать mongod и нам express сервер в двух разных вкладках консоли.
Для работы с этой базой данных нам нужно установить пакет node-mongodb-native
npm install mongodb --save
Это нативный пакет для работы с nodejs.
Для начала нам необходимо импортировать MongoClient из пакета mongodb.
var MongoClient = require('mongodb').MongoClient;
и добавим переменную db в которой будет хранить ссылку на базу данных после подключения
var db;
и теперь внизу файла подконнектимся к базе данных, запишем в db ссылку на базу данных и запустим наш вебсервер
MongoClient.connect('mongodb://localhost:27017/myapi', function (err, database) {
if (err) {
return console.log(err);
}
db = database;
app.listen(3012, function () {
console.log('API app started');
})
})
первым пераметром к connect указывается ссылка на нашу базу данных. Порт 27017 - это порт, где база данных поднимается по умолчанию. Мы можем указать любое название базы данных и она создастся автоматически.
Теперь мы можем быть уверены, что база данных будет доступна нам сразу же после подключения. Не забудьте, что если у вас не запущен mongodb, то и сервер не стартанет и вы увидите в консоли ошибку, что мы не можем обратиться к базе данных.
Итак теперь доступ к базе у нас есть и давайте реализуем сохранение исполнителей в базу.
Наша база данных состоит из коллекций. У нас может например быть коллекция исполнителей, треков, плейлистов. В данном случае мы будем работать только с коллекцией исполнителей.
app.post('/artists', function (req, res) {
var artist = {
name: req.body.name
};
db.collection('artists').insert(artist, (err, result) => {
if (err) {
console.log(err);
return res.sendStatus(500);
}
res.send(artist);
})
})
Вызывая db.collection('artists') мы обращаемся к коллекции исполнителей. Если ее не существовало, то она будет создана автоматически. Дальше мы вызываем метод insert, который вставит артиста в базу данных. В коллбеке мы проверяем что у нас не было ошибки. Если была, то возвращаем статус 500. Если не было возвращаем артиста.
Давайте попробуем. Обратите внимание, что мы вернули нашего артиста, но в респонзе получили его уже с id. MongoClient автоматически генерирует уникальный id для записи.
Теперь давайте реализуем получение списка исполнителей.
app.get('/artists', function (req, res) {
db.collection('artists').find().toArray(function (err, docs) {
if (err) {
console.log(err);
return res.sendStatus(500);
}
res.send(docs);
})
})
Здесь мы обращаемся к коллекции и говорим найди нам все документы в коллекции. Потом превращаем их в массив и возвращаем на рендер.
Теперь поиск отдельного документа в коллекции.
Для начала нам необходимо импортировать ObjectID из mongodb;
var ObjectID = require('mongodb').ObjectID
app.get('/artists/:id', function (req, res) {
db.collection('artists').findOne({ _id: ObjectID(req.params.id) }, function (err, doc) {
if (err) {
console.log(err);
return res.sendStatus(500);
}
res.send(doc);
})
})
Тут мы используем метод findOne, которые вернет нам только один найденный документ. В качестве параметра он принимает обьект, где мы указываем, что хотим найти документ с id req.params.id. Тут есть нюанс, что на самом деле наши IDшники в базе это специальные ObjectID. Для нас это не важно пока, но чтобы найти документ нам нужно превратить нашу строку из параметров в ObjectID. В результате мы получим документ, который и возвращаем.
Итак в этом уроке мы установили базу данных, подключили ее к проекту и порефакторили наши методы get и post, чтобы они работали с базой данных.
Если у вас возникли какие-то вопросы или комментарии, пишите их прямо под этим видео.