«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Создание быстрого и гибкого CRUD API с помощью Node.js и собственных драйверов MongoDB

Создание быстрого и гибкого CRUD API с помощью Node.js и собственных драйверов MongoDB

Опубликовано 21 августа 2024 г.
Просматривать:715

Building a Fast and Flexible CRUD API with Node.js and MongoDB Native Drivers

Использование Node.js и Express с собственными драйверами MongoDB: почему и как

Если вы работаете с Node.js и Express, возможно, вы столкнулись с Mongoose, популярной библиотекой ODM (моделирование объектных данных) для MongoDB. Хотя Mongoose предоставляет множество полезных функций, есть причины, по которым вы можете выбрать работу напрямую с собственными драйверами MongoDB. В этом посте я расскажу вам о преимуществах использования собственных драйверов MongoDB и расскажу, как с их помощью можно реализовать простой CRUD API.

Зачем использовать собственные драйверы MongoDB?

  1. Производительность: собственные драйверы MongoDB обеспечивают более высокую производительность за счет прямого взаимодействия с MongoDB без дополнительного уровня абстракции, который представляет Mongoose. Это может быть особенно полезно для высокопроизводительных приложений.

  2. Гибкость: встроенные драйверы обеспечивают больший контроль над вашими запросами и взаимодействием с данными. Mongoose с его схемами и моделями навязывает некоторую структуру, которая может быть не идеальной для каждого варианта использования.

  3. Сокращение накладных расходов: используя собственные драйверы, вы избегаете дополнительных накладных расходов на поддержку схем и моделей Mongoose, что может упростить вашу кодовую базу.

  4. Возможность обучения: работа напрямую с собственными драйверами поможет вам лучше понять работу MongoDB и может стать отличным опытом обучения.

Реализация CRUD API с собственными драйверами MongoDB

Вот пошаговое руководство по настройке простого CRUD API с использованием собственных драйверов Node.js, Express и MongoDB.

1. Настройте подключение к базе данных.

Создайте файл utils/db.js для управления соединением MongoDB:

require('dotenv').config()
const dbConfig = require('../config/db.config');
const { MongoClient } = require('mongodb');

const client = new MongoClient(dbConfig.url);

let _db;
let connectPromise;

async function connectToDb() {
    if (!connectPromise) {
        connectPromise = new Promise(async (resolve, reject) => {
            try {
                await client.connect();
                console.log('Connected to the database ?', client.s.options.dbName);
                _db = client.db();
                resolve(_db);
            } catch (error) {
                console.error('Error connecting to the database:', error);
                reject(error);
            }
        });
    }
    return connectPromise;
}

function getDb() {
    if (!_db) {
        throw new Error('Database not connected');
    }
    return _db;
}

function isDbConnected() {
    return Boolean(_db);
}

module.exports = { connectToDb, getDb, isDbConnected };

2. Определите свою модель

Создайте файл models/model.js для взаимодействия с коллекцией MongoDB:

const { ObjectId } = require('mongodb');
const db = require('../utils/db');

class AppModel {
    constructor($collection) {
        this.collection = null;

        (async () => {
            if (!db.isDbConnected()) {
                console.log('Waiting for the database to connect...');
                await db.connectToDb();
            }
            this.collection = db.getDb().collection($collection);
            console.log('Collection name:', $collection);
        })();
    }

    async find() {
        return await this.collection.find().toArray();
    }

    async findOne(condition = {}) {
        const result = await this.collection.findOne(condition);
        return result || 'No document Found!';
    }

    async create(data) {
        data.createdAt = new Date();
        data.updatedAt = new Date();
        let result = await this.collection.insertOne(data);
        return `${result.insertedId} Inserted successfully`;
    }

    async update(id, data) {
        let condition = await this.collection.findOne({ _id: new ObjectId(id) });
        if (condition) {
            const result = await this.collection.updateOne({ _id: new ObjectId(id) }, { $set: { ...data, updatedAt: new Date() } });
            return `${result.modifiedCount > 0} Updated successfully!`;
        } else {
            return `No document found with ${id}`;
        }
    }

    async deleteOne(id) {
        const condition = await this.collection.findOne({ _id: new ObjectId(id) });
        if (condition) {
            const result = await this.collection.deleteOne({ _id: new ObjectId(id) });
            return `${result.deletedCount > 0} Deleted successfully!`;
        } else {
            return `No document found with ${id}`;
        }
    }
}

module.exports = AppModel;

3. Настройте маршруты

Создайте файл index.js для определения маршрутов API:

const express = require('express');
const router = express.Router();

const users = require('../controllers/userController');

router.get("/users", users.findAll);
router.post("/users", users.create);
router.put("/users", users.update);
router.get("/users/:id", users.findOne);
router.delete("/users/:id", users.deleteOne);

module.exports = router;

4. Реализация контроллеров

Создайте файл userController.js для обработки операций CRUD:

const { ObjectId } = require('mongodb');
const Model = require('../models/model');

const model = new Model('users');

let userController = {
    async findAll(req, res) {
        model.find()
            .then(data => res.send(data))
            .catch(err => res.status(500).send({ message: err.message }));
    },
    async findOne(req, res) {
        let condition = { _id: new ObjectId(req.params.id) };
        model.findOne(condition)
            .then(data => res.send(data))
            .catch(err => res.status(500).send({ message: err.message }));
    },
    create(req, res) {
        let data = req.body;
        model.create(data)
            .then(data => res.send(data))
            .catch(error => res.status(500).send({ message: error.message }));
    },
    update(req, res) {
        let id = req.body._id;
        let data = req.body;
        model.update(id, data)
            .then(data => res.send(data))
            .catch(error => res.status(500).send({ message: error.message }));
    },
    deleteOne(req, res) {
        let id = new ObjectId(req.params.id);
        model.deleteOne(id)
            .then(data => res.send(data))
            .catch(error => res.status(500).send({ message: error.message }));
    }
}

module.exports = userController;

5. Конфигурация

Сохраните строку подключения MongoDB в файле .env и создайте файл db.config.js для ее загрузки:

module.exports = {
    url: process.env.DB_CONFIG,
};

Заключение

Переход с Mongoose на собственные драйверы MongoDB может стать стратегическим выбором для определенных проектов, предлагая преимущества в производительности и большую гибкость. Представленная здесь реализация должна дать вам прочную основу для создания приложений с использованием собственных драйверов Node.js и MongoDB.

Не стесняйтесь ознакомиться с полным кодом на GitHub и изучить дополнительные функции и улучшения для своих собственных проектов!

Если у вас возникнут дополнительные вопросы, не стесняйтесь комментировать.

Удачного программирования! ?

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/jafeer_shaik_f5895990c4ae/building-a-fast-and-flexible-crud-api-with-nodejs-and-mongodb-native-drivers-2i1h?1 Если есть какие-либо нарушения , пожалуйста, свяжитесь с Study_golang @163.comdelete
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3