Задача, реализовать роутинг на express используя базу из mysql. Есть три страницы: главная, кафедра, преподаватели. На главной ссылка переход на страницу кафедры, где в таблице указаны id и названия кафедры, у каждой кафедры есть ссылка при перехде по которой поподаем на страницу преподавателей, и вот тут начинаются сложности,никак не пойму что делать, при переходе по ссылке кафедр наужно показать преподавателей которые преподоют в соответствующей кафедре и на url строке показать kafedra/prepod/х где х является id кафедры
вот мой код:
//app.js
const express = require('express')
const app = express()
var mysql = require('mysql');
var connection = mysql.createConnection({
host: "localhost",
user: "root",
password: "",
database:'institut'
});
connection.connect();
app.use(express.static('public'))
app.set('view engine', 'ejs')
app.set('views','pages')
app.get('/', function (req, res) {
res.render('main')
})
app.get('/kafedra',(req,res)=>{
connection.query('select*from detales join kafedra on detales.kafedra_id=kafedra',(err,data)=>{
res.render('kafedra',{data})
console.log(data);
})
})
app.get("/kafedra/prepodavateli/:id",(req,res)=>{
let id= req.params.id
res.render('prepodavateli')
})
app.listen(3000,()=>{
console.log('server started');
})
<!--kafedra.ejs-->
<table class="table table-dark">
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>actions</th>
</tr>
</thead>
<tbody>
<% datas.forEach(item=>{ %>
<tr>
<td><%= item.id %></td>
<td><%= item.name %></td>
<td><a href="/kafedra/prepodavateli">prepodavateli</a></td>
</tr>
<% }) %>
</tbody>
</table>
<!--prepodavateli.ejs-->
это база:
Итак, давай по порядку. Сначала определимся с базой: мы делаем REST-API, правильно? Если да, то определимся с роутами. Их будет три:
- Главная(список кафедр)
- Страница кафедры (со ссылкой на список преподавателей)
- Список преподавателей
Правильно? Если да, то идем дальше.
Согласно первому попавшемуся документу по REST роуты будут называться так:
/kafedras
/kafedras/:id
/kafedras/:id/prepodavateli
Я бы советовал сразу переводить на английский, но это такое. Главное - обрати внимание на то, что существительные во множественном числе, и что после них идет id
, причем этот id относится к предыдущему существительному. То есть, в роуте kafedra/prepod/х
x - это не id кафедры, а id преподавателя (потому что он идет сразу после слова преподаватель
).
Ты, конечно, можешь сделать по-своему и располагать id как угодно, но это будет нарушением конвенции и в общем дурной практикой. Ну и, строго говоря, это уже не будет REST.
Теперь собственно по существу вопроса.
В первом роуте все понятно: делаешь SELECT всех кафедр SELECT * from faculty
Во втором тоже просто: у тебя есть id кафедры, по нему и вынимаешь SELECT * from faculty WHERE id = ${id}
С третьим сложновато: у тебя есть id кафедры, но вынуть нужно преподавателей с помощью таблицы detales
(названия таблиц тоже отдельная тема, в твоем случае это будет какой-нибудь kafedra_prepodavatel
). Да, скорее всего там будет какой-нибудь join, но я их не очень знаю, поэтому я просто выбирал по очереди (подход заведомо неправильный и в продакшене приведет к проседанию производительности, но для учебного проекта сойдет. Если только это не учебный проект по SQL, где на это специально обратят внимание).
app.get("/kafedra/:id/prepodavateli",(req,res)=>{
const id= req.params.id;
db.any(`SELECT * from faculty_tutor WHERE faculty_id = ${id}`)
.then(facultyTutors => {
const tutorIds = facultyTutors.map(ft => ft.tutor_id);
return db.any(`SELECT * from tutor where id in (${tutorIds.join(', ')})`) // postgres, в mysql синтакс может быть другим
})
.then((tutors) => {
res.render('prepodavateli', {tutors, facultyId: id});
})
})
EDIT: гугл принес вот такой query и он даже работает. Но пусть кто разбирается, посмотрит, какие там подводные камни.
SELECT prepodavateli.* FROM prepodavateli INNER JOIN detales ON detales.prepodavateli_id = prepodavateli.id WHERE detales.kafedra_id = ${kafedraId}
1 лайк
А также: что будет, есть пользователь перейдет по адресу
/kafedra/null;DROP table prepodavateli;
?
Что с этим делать?
2 лайка