Мы получаем запросы, но нигде не храним их. Нам нужна база данных для хранения данных. Мы будем использовать известную базу данных NoSQL под названием MongoDB . Чтобы установить и прочитать о Mongo, перейдите по этой ссылке.
Чтобы использовать Mongo с Koa, нам нужен клиентский API для узла. У нас есть несколько вариантов, однако в этом уроке мы остановимся на мангусте . Mongoose используется для моделирования документов в Node для MongoDB. Моделирование документов означает, что мы создадим модель (во многом как класс в документно-ориентированном программировании), а затем создадим документы, используя эту модель (как мы создаем документы класса в ООП). Вся наша обработка будет производиться на этих «документах», затем, наконец, мы запишем эти документы в нашу базу данных.
Настройка мангуста
Теперь, когда у нас установлен Mongo, давайте установим mongoose, точно так же, как мы устанавливали наши другие пакеты узлов.
$ npm install --save mongoose
Прежде чем мы начнем использовать mongoose, мы должны создать базу данных, используя оболочку Mongo. Чтобы создать новую базу данных, откройте свой терминал и введите «Монго». Запустится оболочка Монго, введите следующее.
use my_db
Новая база данных будет создана для вас. Всякий раз, когда вы открываете оболочку Mongo, она по умолчанию будет «тестировать» БД, и вам придется перейти в базу данных, используя ту же команду, что и выше.
Чтобы использовать mongoose, нам потребуется это в нашем файле app.js, а затем подключиться к сервису mongod, работающему на mongodb: // localhost
var koa = require('koa'); var _ = require('koa-router')(); var app = koa(); var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/my_db'); app.use(_.routes()); app.listen(3000);
Теперь наше приложение подключено к нашей базе данных, давайте создадим новую модель. Эта модель будет выступать в качестве коллекции в нашей базе данных. Чтобы создать новую модель, используйте следующий код, прежде чем определять любые маршруты.
var koa = require('koa'); var _ = require('koa-router')(); var app = koa(); var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/my_db'); var personSchema = mongoose.Schema({ name: String, age: Number, nationality: String }); var Person = mongoose.model("Person", personSchema); app.use(_.routes()); app.listen(3000);
Приведенный выше код определяет схему для человека и используется для создания мангуста Model Person .
Сохранение документов
Теперь мы создадим новую HTML-форму, которая получит информацию о человеке и сохранит ее в нашей базе данных. Чтобы создать форму, создайте новый файл представления с именем person.pug в каталоге представлений со следующим содержимым.
html head title Person body form(action = "/person", method = "POST") div label(for = "name") Name: input(name = "name") br div label(for = "age") Age: input(name = "age") br div label(for = "nationality") Nationality: input(name = "nationality") br button(type = "submit") Create new person
Также добавьте новый маршрут get в index.js, чтобы отобразить этот документ.
var koa = require('koa'); var _ = require('koa-router')(); var app = koa(); var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/my_db'); var personSchema = mongoose.Schema({ name: String, age: Number, nationality: String }); var Person = mongoose.model("Person", personSchema); _.get('/person', getPerson); function *getPerson(next){ this.render('person'); yield next; } app.use(_.routes()); app.listen(3000);
Перейдите на localhost: 3000 / чел., Чтобы проверить, правильно ли отображается наша форма. Обратите внимание, что это просто пользовательский интерфейс, он еще не работает. Вот так выглядит наша форма.
Теперь мы определим обработчик почтового маршрута в / person, который будет обрабатывать этот запрос.
var koa = require('koa'); var _ = require('koa-router')(); var app = koa(); var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/my_db'); var personSchema = mongoose.Schema({ name: String, age: Number, nationality: String }); var Person = mongoose.model("Person", personSchema); _.post('/person', createPerson); function *createPerson(next){ var self = this; var personInfo = self.request.body; //Get the parsed information if(!personInfo.name || !personInfo.age || !personInfo.nationality){ self.render( 'show_message', {message: "Sorry, you provided wrong info", type: "error"}); } else { var newPerson = new Person({ name: personInfo.name, age: personInfo.age, nationality: personInfo.nationality }); yield newPerson.save(function(err, res) { if(err) self.render('show_message', {message: "Database error", type: "error"}); else self.render('show_message', {message: "New person added", type: "success", person: personInfo}); }); } } app.use(_.routes()); app.listen(3000);
В приведенном выше коде, если мы получим любое пустое поле или не получим никакого поля, мы отправим ответ об ошибке. Однако, если мы получаем правильно сформированный документ, мы создаем документ newPerson из модели Person и сохраняем его в нашей БД с помощью функции newPerson.save () . Это определено в mongoose и принимает обратный вызов в качестве аргумента. Этот обратный вызов имеет два аргумента, ошибку и ответ . Это отобразит представление show_message, поэтому нам нужно его создать.
Чтобы показать ответ от этого маршрута, нам также нужно создать представление show_message . Создайте новый вид с помощью следующего кода.
html head title Person body if(type = "error") h3(style = "color:red") #{message} else h3 New person, name: #{person.name}, age: #{person.age} and nationality: #{person.nationality} added!
Ниже приводится ответ, который мы получаем при успешной отправке формы (show_message.pug).
Теперь у нас есть интерфейс для создания людей!
Получение документов
Mongoose предоставляет множество функций для извлечения документов, мы сосредоточимся на трех из них. Все эти функции также принимают обратный вызов в качестве последнего параметра, и, как и функция сохранения, их аргументы — это ошибка и ответ.
Три функции —
Model.find (условия, обратный вызов)
Эта функция находит все документы, соответствующие полям в объекте условий. Те же операторы, которые используются в Mongo, также работают в mongoose. Например, это приведет к получению всех документов из коллекции людей.
Person.find(function(err, response){ console.log(response); });
При этом будут получены все документы, для которых поле имеет имя «Аюш» и его возраст равен 20.
Person.find({name: "Ayush", age: 20}, function(err, response){ console.log(response); });
Мы также можем предоставить необходимую нам проекцию, то есть поля, которые нам нужны. Например, если нам нужны только имена людей, национальность которых «индус» , мы используем —
Person.find({nationality: "Indian"}, "name", function(err, response) { console.log(response); });
Model.findOne (условия, обратный вызов)
Эта функция всегда выбирает один, самый важный документ. Он имеет те же точные аргументы, что и Model.find ().
Model.findById (id, обратный вызов)
Эта функция принимает _id (определенный mongo) в качестве первого аргумента, необязательную строку проекции и обратный вызов для обработки ответа. Например,
Person.findById("507f1f77bcf86cd799439011", function(err, response){ console.log(response); });
Давайте создадим маршрут для просмотра всех записей людей.
var koa = require('koa'); var _ = require('koa-router')(); var app = koa(); var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/my_db'); var personSchema = mongoose.Schema({ name: String, age: Number, nationality: String }); var Person = mongoose.model("Person", personSchema); _.get('/people', getPeople); function *getPeople(next){ var self = this; yield Person.find(function(err, response){ self.body = response; }); } app.use(_.routes()); app.listen(3000);
Обновление документов
Mongoose предоставляет три функции для обновления документов.
Model.update (состояние, обновления, обратный вызов)
Эта функция принимает условие и обновляет объект в качестве входных данных и применяет изменения ко всем документам, соответствующим условиям в коллекции. Например, следующий код обновит все документы Person, чтобы иметь национальность «американец».
Person.update({age: 25}, {nationality: "American"}, function(err, response){ console.log(response); });
Model.findOneAndUpdate (условие, обновления, обратный вызов)
Он делает именно то, что говорит. Находит один документ на основе запроса и обновляет его согласно второму аргументу. Он также принимает обратный вызов в качестве последнего аргумента. Например,
Person.findOneAndUpdate({name: "Ayush"}, {age: 40}, function(err, response){ console.log(response); });
Model.findByIdAndUpdate (идентификатор, обновления, обратный вызов)
Эта функция обновляет один документ, идентифицируемый по его идентификатору. Например,
Person.findByIdAndUpdate("507f1f77bcf86cd799439011", {name: "James"}, function(err, response){ console.log(response); });
Давайте создадим маршрут для обновления людей. Это будет маршрут PUT с идентификатором в качестве параметра и деталями в полезной нагрузке.
var koa = require('koa'); var _ = require('koa-router')(); var app = koa(); var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/my_db'); var personSchema = mongoose.Schema({ name: String, age: Number, nationality: String }); var Person = mongoose.model("Person", personSchema); _.put('/people/:id', updatePerson); function *updatePerson() { var self = this; yield Person.findByIdAndUpdate(self.params.id, {$set: {self.request.body}}, function(err, response){ if(err) { self.body = { message: "Error in updating person with id " + self.params.id}; } else { self.body = response; } }); } app.use(_.routes()); app.listen(3000);
Чтобы проверить этот маршрут, введите в своем терминале следующее (замените идентификатор на идентификатор из созданных вами людей).
curl -X PUT --data "name = James&age = 20&nationality = American" https://localhost:3000/people/507f1f77bcf86cd799439011
Это обновит документ, связанный с идентификатором, указанным в маршруте, с указанными выше деталями.
Удаление документов
Мы рассмотрели C reate, R ead и U pdate, теперь мы увидим, как mongoose может использоваться для удаления документов. Здесь есть три функции, в точности как обновление.
Model.remove (условие, [обратный вызов])
Эта функция принимает объект условия в качестве входных данных и удаляет все документы, соответствующие условиям. Например, если нам нужно удалить всех людей в возрасте 20 лет,
Person.remove({age:20});
Model.findOneAndRemove (условие, [обратный вызов])
Эта функция удаляет один , наиболее релевантный документ в соответствии с объектом условий. Например,
Person.findOneAndRemove({name: "Ayush"});
Model.findByIdAndRemove (id, [callback])
Эта функция удаляет один документ, идентифицируемый по его идентификатору. Например,
Person.findByIdAndRemove("507f1f77bcf86cd799439011");
Теперь давайте создадим маршрут для удаления людей из нашей базы данных.
var koa = require('koa'); var _ = require('koa-router')(); var app = koa(); var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/my_db'); var personSchema = mongoose.Schema({ name: String, age: Number, nationality: String }); var Person = mongoose.model("Person", personSchema); _.delete('/people/:id', deletePerson); function *deletePerson(next){ var self = this; yield Person.findByIdAndRemove(self.params.id, function(err, response){ if(err) { self.body = {message: "Error in deleting record id " + self.params.id}; } else { self.body = {message: "Person with id " + self.params.id + " removed."}; } }); } app.use(_.routes()); app.listen(3000);
Чтобы проверить это, используйте следующую команду curl —
curl -X DELETE https://localhost:3000/people/507f1f77bcf86cd799439011
Это удалит человека с данным идентификатором, создающего следующее сообщение. —
{message: "Person with id 507f1f77bcf86cd799439011 removed."}
Это завершает, как мы можем создавать простые приложения CRUD, используя MongoDB, mongoose и Koa. Чтобы узнать больше о мангусте, прочитайте документацию по API.