@MishaXXL

Как настраивается обработка роута, где возможна строка запроса?

Есть роут site.ru/api/users

Изначально роут выглядел так
router.get('/', async (req: Req, res: Response): Promise<void> => {
	await UserModel.readAll()
	.then(data => res.status(200).json(data))
	.catch(() => res.status(400).json(null))
})


Но после решил добавить выборку для пагинации
router.get('/', async (req: Req, res: Response): Promise<void> => {
	const { offset } = req.query
	const { limit } = req.query
	await UserModel.readAll(limit, offset)
	.then(data => res.status(200).json(data))
	.catch(() => res.status(400).json(null))
})


И метод стал уже выглядеть слишком широко и как будто немного запутанно из-за дополнительной зоны ответственности
static async readAll(limit, offset): Promise<QueryResult> {
        if(limit && offset) {
            const data = await DataBase.query(`SELECT * from users ORDER BY id LIMIT ${+limit} OFFSET ${+offset}`)
            .then(data => data.rows)
            .catch(err => {
                throw new Error(err.message)
            })
            const count = await DataBase.query(`SELECT COUNT(*) from users`)
            .then(data => data.rows[0]?.count)
            .catch(err => {
                throw new Error(err.message)
            })
            return { data, count }
       }

    return await DataBase.query(`SELECT * from users`)
        .then(data => data.rows)
        .catch(err => {
            throw new Error(err.message)
        })
}


Как правильно настраиваются роуты подобного типа?
  • Вопрос задан
  • 41 просмотр
Решения вопроса 1
TTATPuOT
@TTATPuOT
https://code.patriotovsky.ru/
Если завтра вы захотите сделать получение пользователей по какому-либо принципу (роль, фамилия, дата регистрации), то метод readAll разрастётся ещё сильнее и вы будете передавать в него очень много параметров. Это неправильно.

Так же у вас ошибка - в методе readAll не может быть и получения всех пользователей, и получения их количества (count). Подсчёт строк - это отдельный метод, который отдельно должен дёргаться в роуте. Метод readAll только получает пользователей.

Относительно вашей проблемы - проще всего использовать готовую ORM, а не пытаться самому её написать. Но по каким-то причинам ORM не хочется, достаточно сделать вместо нескольких параметров один объект - запрос и передавать его.

Важно, что передав объект, вы должны его правильно преобразовать в SELECT. Этим может заниматься сам объект, например. А можно написать ещё один, который будет преобразовывать объекты запросов в SQL-строку, которую вы уже будете использовать в readAll.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы