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.