Я разрабатываю веб-приложение, используя Node.js
/ express
бэкэнд и MongoDB
в качестве базы данных.
Приведенный ниже пример относится к странице панели администратора, где я буду отображать карточки с различной информацией, относящейся к пользователям на сайте. Я мог бы хотеть показать - на образце страницы - например:
- Количество пользователей каждого типа
- Наиболее распространенное местоположение для каждого типа пользователя
- Сколько регистраций в месяц
- Самые популярные должности
Я мог бы сделать все это по одному маршруту, где у меня есть контроллер, который выполняет все эти задачи и связывает их как объект с URL-адресом, который затем я могу получить из данных с помощью ajax
. Или я мог бы разделить каждую задачу на свой собственный маршрут / контроллер с отдельным вызовом ajax для каждой. То, что я пытаюсь решить, - это , каковы лучшие практики для выполнения нескольких вызовов ajax на одной странице .
Пример:
Я создаю страницу, где я создам интерактивную таблицу, используя DataTables для разных типов пользователей (в настоящее время их два: mentors
и mentees
). В этом примере требуется всего два запроса данных (по одному для каждого типа пользователя), но моя последняя страница будет больше похожа на 10.
Для каждого типа пользователя я выполняю вызов get ajax для каждого типа пользователя и собираю таблицу из возвращаемых данных:
Тип пользователя 1 - Подопечные
$.get('/admin/' + id + '/mentees')
.done(data => {
$('#menteeTable').DataTable( {
data: data,
"columns": [
{ "data": "username"},
{ "data": "status"}
]
});
})
Тип пользователя 2 - Наставники
$.get('/admin/' + id + '/mentors')
.done(data => {
$('#mentorTable').DataTable( {
data: data,
"columns": [
{ "data": "username"},
{ "data": "position"}
]
});
})
Это требует двух маршрутов в моем бэкэнде Node.js:
router.get("/admin/:id/mentors", getMentors);
router.get("/admin/:id/mentees", getMentees);
И два контроллера, которые структурированы одинаково (но фильтруют для разных типов пользователей):
getMentees(req, res, next){
console.log("Controller: getMentees");
let query = { accountType: 'mentee', isAdmin: false };
Profile.find(query)
.lean()
.then(users => {
return res.json(users);
})
.catch(err => {
console.log(err)
})
}
Это прекрасно работает. Однако, поскольку мне нужно сделать несколько запросов данных, я хочу убедиться, что я строю это правильно. Я вижу несколько вариантов:
- Выполнять отдельные вызовы ajax для каждого типа данных и выполнять любые тяжелые операции с бэкэндом (например, подсчет пользовательских типов и возврата) - как указано выше
- Делайте отдельные вызовы ajax для каждого типа данных, но выполняйте тяжелую работу на внешнем интерфейсе . В приведенном выше примере я мог бы так же легко отфильтровать
isAdmin
пользователей на data
, возвращенных из моего вызова ajax
- Делайте меньше вызовов ajax, которые запрашивают меньше уточненных данных . В приведенном выше примере я мог бы сделать один вызов (требующий только один маршрут / контроллер) для всех пользователей, а затем отфильтровать
data
на внешнем интерфейсе, чтобы построить две таблицы
Мне бы хотелось посоветовать, какая стратегия наиболее эффективна с точки зрения времени, затраченного на поиск данных
UPDATE
Чтобы прояснить вопрос, я мог бы достичь того же результата, что и выше, используя настройки контроллера примерно так:
Profile.find(query)
.lean()
.then(users => {
let mentors = [],
mentees = []
users.forEach(user => {
if(user.accountType === 'mentee') {
mentees.push(user);
} else if (user.accountType === 'mentor') {
mentors.push(user);
}
});
return res.json({mentees, mentors});
})
А затем сделайте один ajax
вызов и разбейте данные соответствующим образом. У меня вопрос: какой вариант предпочтительнее?