Продолжим работу с проектом из прошлой темы и в качестве базы данных вместо массива используем базу данных MongoDB. Для взаимодействия с MongoDB будем использовать Mongoose.
Итак, вначале добавим mongoose в проект:
npm install mongoose --save
Проект в прошлой теме выглядел следующим образом:
Теперь нам надо добавить в него связь с mongodb. Вначале изменим в папке models файл user.js, где хранится определение используемой модели:
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
// установка схемы
const userScheme = new Schema({
name: String,
age: Number
});
module.exports = mongoose.model("User", userScheme);
Теперь модель User представляет модель mongoose, которая определяется с помощью схемы userSheme. Поскольку модель mongoose уже автоматически имеет ряд методов для взаимодействия с базой данных, соответственно нам не надо прописывать специальные методы для добавления или получения данных, как в прошлой теме.
Далее в папке controllers изменим файл userController.js:
const User = require("../models/user.js");
exports.addUser = function (request, response){
response.render("create.hbs");
};
exports.getUsers = async function(request, response){
const allUsers = await User.find({});
response.render("users.hbs", { users: allUsers });
};
exports.postUser= async function(request, response){
if(!request.body) return response.sendStatus(400);
const userName = request.body.name;
const userAge = request.body.age;
const user = new User({name: userName, age: userAge});
await user.save();
response.redirect("/users");
};
В методе getUsers() вызывается метод User.find(), который получает данные из базы данных и передает их в представление
users.hbs.
В методе postUser() из полученных данных создается объект User, и у него вызывается метод save(), который сохраняет
объект в бд.
Файл userRouter.js из папки routes, который связывает маршруты и контроллер userController, остается тем же самым:
const express = require("express");
const userController = require("../controllers/userController.js");
const userRouter = express.Router();
userRouter.use("/postuser", userController.postUser);
userRouter.use("/create", userController.addUser);
userRouter.use("/", userController.getUsers);
module.exports = userRouter;
И в конце изменим главный файл приложения app.js:
const express = require("express");
const mongoose = require("mongoose");
const app = express();
const userRouter = require("./routes/userRouter.js");
const homeRouter = require("./routes/homeRouter.js");
app.set("view engine", "hbs");
app.use(express.urlencoded({ extended: false }));
app.use("/users", userRouter);;
app.use("/", homeRouter);
app.use(function (req, res) {
res.status(404).send("Not Found")
});
async function main() {
try{
await mongoose.connect("mongodb://127.0.0.1:27017/usersdb");
app.listen(3000);
console.log("Сервер ожидает подключения...");
}
catch(err) {
return console.log(err);
}
}
main(); // запускаем приложение
// прослушиваем прерывание работы программы (ctrl-c)
process.on("SIGINT", async() => {
await mongoose.disconnect();
console.log("Приложение завершило работу");
process.exit();
});
Теперь сервер начинает принимать запросы после установки подключения с базой данных MondoDB.
Все остальные файлы остаются без изменений.
Запустим приложение, обратимся по адресу http://localhost:3000/users/create и добавим одного пользователя:
И после успешного добавления данные попадут в бд, и нас переадресуют на страницу, где мы увидим все ранее добавленные данные: