Как управлять связью между контроллером и моделью - PullRequest
0 голосов
/ 06 апреля 2020

Я использую NodeJS и Express для создания REST API. Давайте получим пользователя по его идентификатору. У меня есть маршрутизатор, модели и контроллеры.

Сначала я монтирую свои маршруты в routes/index.js

const user_routes = require('./userRoutes')

module.exports = app => {
    app.use('/user', user_routes)
}

Затем я определяю маршрут в /routes/userRoutes.js, который используется для получения пользователя по его идентификатору. , Далее я включаю контроллер для моего пользователя.

const Router = require('express-promise-router')
const user_controller = require('../controllers/userController');

const router = new Router()

module.exports = router

// Get user by ID
router.get('/:id', user_controller.getById)

Контроллер определен в /controllers/userController.js и включает модель пользователя.

const user_model = require('../models/userModel')

const getById = async (req, res) => {
    user_data = req.params

    try {
        user = await user_model.getById(user_data.id)
        // User not found
        if (user === null) {
            res.status(404)
            res.send("User not found.")
        } else {
            res.send(user)
        }
    } catch (err) {
        res.status(500)
        res.send("Something went wrong on the server")
    }
}

module.exports = {
    getById,
}

И в /models/userModel.js мы имеем модель

const db = require('../db')
const bcrypt= require('bcrypt');

// Get user by ID
//
// 200: User found
// 404: User not found
// 500: Server-side error
const getById = async (id) => {
    // Set up query object
    const query = {
        text: 'SELECT * FROM users where id=$1',
        values: [id]
    }

    try {
        // Get user by id
        const { rows } = await db.query(query)

        // Reutrn user
        if ( rows.length == 1) {
            return rows[0]
        }
        // Return null if no user with this id was found
        else {
            return null
        }
    } catch (err) {
        throw (err)
    }
}

Как видите, проверка реальных данных не проводилась. Если идентификатор не число, мы просто получаем ошибку 500. Так что этот код не заботится обо всех крайних случаях. Моя текущая проблема состоит в том, чтобы знать, как правильно позволить моей модели общаться с моим контроллером. В настоящее время у меня есть только 3 случая в этом примере, в то время как один из них является ошибкой сервера - которую я просто позволил «всплыть», иначе перебросить, пока я где-то правильно его не поймал. Тогда у меня либо есть пользователь, либо нет (ноль).

Есть ли какой-то большой недостаток в таком виде связи между моделью и контроллером?

...