MongoDB и Express CRUD


Настройка бэкенда

Создайте файлы в соответствующих каталогах в папке backend.

config/db.js

В корневом каталоге есть файл .env для ключа db и других переменных окружения.

.env

NODE_ENV = development
PORT = 5001
MONGO_URI = <connection to mongoDB uri>
Вход в полноэкранный режим Выйти из полноэкранного режима

Server.js

Начальная конфигурация стартовых маршрутов для бэкенда.

const express = require("express");
const colors = require("colors");
const dotenv = require("dotenv").config();
const connectDb = require('./config/db')
const port = process.env.PORT || 5001;
const { errorHandler } = require("./middleware/errorMiddleware");

connectDb()

const app = express();

app.use(express.json());
app.use(express.urlencoded({ extended: false }));

app.use("/api/goals", require("./routes/goalRoutes"));

app.use(errorHandler);

app.listen(port, () => console.log(`Server start on port ${port}`));
Войти в полноэкранный режим Выход из полноэкранного режима

Файлы бэкенда

./config/db.js

const mongoose = require('mongoose');

const connectDB = async () => {
  try {
    const conn = await mongoose.connect(process.env.MONGO_URI);
    console.log(
      `MongoDB Connected: ${conn.connection.host}`.cyan.underline
    );
  } catch (error) {
    console.log("error", error);
    process.exit(1);
  }
};

module.exports = connectDB;
Войти в полноэкранный режим Выход из полноэкранного режима

./controllers/goalController.js

const asyncHandler = require('express-async-handler');

const Goal = require('../models/goalModel');

const getGoals = asyncHandler(async (req, res) => {
  const goals = await Goal.find();
  res.status(200).json(goals);
});

const setGoal = asyncHandler(async (req, res) => {
  if (!req.body.text) {
    res.status(400);
    throw new Error("Please add a text field");
  }

  const goal = await Goal.create({
    text: req.body.text,
  });

  res.status(200).json(goal);
});
// Other CRUD actions below

module.exports = {
  getGoals,
  setGoal,
  ...
}; 
Войти в полноэкранный режим Выход из полноэкранного режима

./middleware/errorMiddleware.js

const errorHandler = (err, req, res, next) => {
  const statusCode = res.statusCode ? res.statusCode : 500;
  res.status(statusCode);

  res.json({
    message: err.message,
    stack: process.env.NODE_ENV === "production" ? null : err.stack,
  });
};

module.exports = {
  errorHandler,
};

// "./models/goalModel.js"
const mongoose = require("mongoose");

const goalSchema = mongoose.Schema(
  {
    text: {
      type: String,
      required: [true, "Please add a text value"],
    },
  },
  {
    timestamps: true,
  }
);

module.exports = mongoose.model("Goal", goalSchema);
Войти в полноэкранный режим Выход из полноэкранного режима

./routes/goalRoutes.js

const express = require("express");
const router = express.Router();
const {
    getGoals,
    setGoal,
    updateGoal,
    deleteGoal,
} = require("../controllers/goalController");

router.get('/', (req, res) => {
  res.status(200).json({ message: "Get goals" });
});

router.post('/', (req, res) => {
  res.status(200).json({ message: "Set goal" });
});

router.put('/:id', (req, res) => {
  res.status(200).json({ message: `Update goal ${req.params.id}` });
});

router.delete('/:id', (req, res) => {
  res.status(200).json({ message: `Delete goal ${req.params.id}` });
});

module.exports = router;
Войти в полноэкранный режим Выход из полноэкранного режима

Переработайте методы маршрутизатора, чтобы очистить его.

// "./routes/goalRoutes.js"
...

router.route('/').get(getGoals).post(setGoal)
router.route('/:id').delete(deleteGoal).put(updateGoal)

...

Войти в полноэкранный режим Выход из полноэкранного режима

Общая настройка маршрутов и обработка ошибок позволяет быстро настроить все необходимое. Проверьте с помощью REST-клиента, чтобы убедиться, что все маршруты работают с надлежащим откликом.

Все действия контроллера асинхронны и потребуют использования async/await.

Использование express.js все еще относительно ново для меня, пришедшего из Rails, но использование JavaScript и рефакторинг, вовлеченный для поддержания разделения проблем в порядке, является более или менее простым.

Оцените статью
Procodings.ru
Добавить комментарий