ExpressJS - База данных

Мы продолжаем получать запросы, но в конечном итоге их нигде не храним. Нам нужна база данных для хранения данных. Для этого мы будем использовать базу данных NoSQL под названиемMongoDB.

Чтобы установить и прочитать о Mongo, перейдите по этой ссылке.

Чтобы использовать Mongo с Express, нам нужен клиентский API для node. У нас есть несколько вариантов, но в этом уроке мы остановимся на мангусте . Мангуст используется дляdocument Modelingв Node для MongoDB. Для моделирования документа мы создаемModel (очень похоже на class в документально-ориентированном программировании), а затем производим documents используя эту модель (как мы создаем documents of a classв ООП). Вся наша обработка будет производиться по этим «документам», и, наконец, мы запишем эти документы в нашу базу данных.

Настройка Mongoose

Теперь, когда вы установили Mongo, давайте установим Mongoose так же, как мы устанавливали другие наши пакеты узлов -

npm install --save mongoose

Прежде чем мы начнем использовать мангуста, мы должны создать базу данных с помощью оболочки Mongo. Чтобы создать новую базу данных, откройте свой терминал и введите «mongo». Запустится оболочка Mongo, введите следующий код -

use my_db

Для вас будет создана новая база данных. Всякий раз, когда вы открываете оболочку mongo, она по умолчанию будет "test" db, и вам придется перейти к своей базе данных, используя ту же команду, что и выше.

Чтобы использовать Mongoose, нам потребуется его в нашем index.js файл, а затем подключитесь к mongodb служба работает на mongodb://localhost.

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);

Приведенный выше код определяет схему для человека и используется для создания режима Mongoose. 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

Также добавьте new get route в index.js для визуализации этого документа -

app.get('/person', function(req, res){
   res.render('person');
});

Идти к "localhost:3000/person", чтобы проверить, правильно ли выводится форма. Обратите внимание, что это всего лишь пользовательский интерфейс, он еще не работает. На следующем снимке экрана показано, как отображается форма -

Теперь мы определим обработчик почтового маршрута в '/person' который будет обрабатывать этот запрос

app.post('/person', function(req, res){
   var personInfo = req.body; //Get the parsed information
   
   if(!personInfo.name || !personInfo.age || !personInfo.nationality){
      res.render('show_message', {
         message: "Sorry, you provided worng info", type: "error"});
   } else {
      var newPerson = new Person({
         name: personInfo.name,
         age: personInfo.age,
         nationality: personInfo.nationality
      });
		
      newPerson.save(function(err, Person){
         if(err)
            res.render('show_message', {message: "Database error", type: "error"});
         else
            res.render('show_message', {
               message: "New person added", type: "success", person: personInfo});
      });
   }
});

В приведенном выше коде, если мы получим какое-либо пустое поле или не получим ни одного поля, мы отправим ответ с ошибкой. Но если мы получаем правильно оформленный документ, мы создаемnewPerson документ из модели Person и сохраните его в нашей БД, используя newPerson.save()функция. Это определено в Mongoose и принимает обратный вызов в качестве аргумента. Этот обратный вызов имеет 2 аргумента - ошибку и ответ. Эти аргументы сделают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!

Мы получим следующий ответ после успешной отправки form(show_message.pug) -

Теперь у нас есть интерфейс для создания persons.

Получение документов

Mongoose предоставляет множество функций для получения документов, мы сосредоточимся на трех из них. Все эти функции также принимают обратный вызов в качестве последнего параметра, и, как и функция сохранения, их аргументами являются ошибка и ответ. Три функции следующие:

Model.find (условия, обратный вызов)

Эта функция находит все документы, соответствующие полям в объекте условий. Те же операторы, что и в Mongo, работают и в мангусте. Например,

Person.find(function(err, response){
   console.log(response);
});

Это позволит получить все документы из коллекции человека.

Person.find({name: "Ayush", age: 20}, 
   function(err, response){
      console.log(response);
});

Это приведет к получению всех документов, в которых имя поля «Аюш» и возраст 20.

Мы также можем предоставить нужную нам проекцию, т. Е. Нужные нам поля. Например, если мы хотим толькоnames людей, чьи nationalityэто «индийский» , мы используем -

Person.find({nationality: "Indian"}, "name", function(err, response){
   console.log(response);
});

Model.findOne (условия, обратный вызов)

Эта функция всегда выбирает один наиболее релевантный документ. Он имеет те же аргументы, что иModel.find().

Model.findById (идентификатор, обратный вызов)

Эта функция принимает _id(определено mongo) в качестве первого аргумента, необязательной строки проекции и обратного вызова для обработки ответа. Например,

Person.findById("507f1f77bcf86cd799439011", function(err, response){
   console.log(response);
});

Давайте теперь создадим маршрут для просмотра всех записей людей -

var express = require('express');
var app = express();

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.get('/people', function(req, res){
   Person.find(function(err, response){
      res.json(response);
   });
});

app.listen(3000);

Обновление документов

Mongoose предоставляет 3 функции для обновления документов. Функции описаны ниже -

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 express = require('express');
var app = express();

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.put('/people/:id', function(req, res){
   Person.findByIdAndUpdate(req.params.id, req.body, function(err, response){
      if(err) res.json({message: "Error in updating person with id " + req.params.id});
      res.json(response);
   });
});

app.listen(3000);

Чтобы проверить этот маршрут, введите в свой терминал следующее (замените идентификатор идентификатором из созданного вами people) -

curl -X PUT --data "name = James&age = 20&nationality = American
"http://localhost:3000/people/507f1f77bcf86cd799439011

Это обновит документ, связанный с идентификатором, указанным в маршруте, с указанными выше деталями.

Удаление документов

Мы покрыли Create, Read и Update, теперь мы посмотрим, как использовать Mongoose для Deleteдокументы. Здесь у нас есть 3 функции, в точности как update.

Model.remove (условие, [обратный вызов])

Эта функция принимает объект условия в качестве входных данных и удаляет все документы, соответствующие условиям. Например, если нам нужно удалить всех людей в возрасте 20 лет, используйте следующий синтаксис -

Person.remove({age:20});

Model.findOneAndRemove (условие, [обратный вызов])

Эта функция удаляет single, наиболее актуальный документ в соответствии с условиями объекта. Давайте выполним следующий код, чтобы понять то же самое.

Person.findOneAndRemove({name: "Ayush"});

Model.findByIdAndRemove (идентификатор, [обратный вызов])

Эта функция удаляет один документ, идентифицированный его идентификатором. Например,

Person.findByIdAndRemove("507f1f77bcf86cd799439011");

Давайте теперь создадим маршрут для удаления людей из нашей базы данных.

var express = require('express');
var app = express();

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.delete('/people/:id', function(req, res){
   Person.findByIdAndRemove(req.params.id, function(err, response){
      if(err) res.json({message: "Error in deleting record id " + req.params.id});
      else res.json({message: "Person with id " + req.params.id + " removed."});
   });
});

app.listen(3000);

Чтобы проверить вывод, используйте следующую команду curl -

curl -X DELETE http://localhost:3000/people/507f1f77bcf86cd799439011

Это удалит человека с данным идентификатором, создав следующее сообщение -

{message: "Person with id 507f1f77bcf86cd799439011 removed."}

На этом заканчивается то, как мы можем создавать простые приложения CRUD с использованием MongoDB, Mongoose и Express. Чтобы узнать больше о Mongoose, прочтите документацию по API.