Роутинг в node.js (express,mysql)

Задача, реализовать роутинг на 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, правильно? Если да, то определимся с роутами. Их будет три:

  1. Главная(список кафедр)
  2. Страница кафедры (со ссылкой на список преподавателей)
  3. Список преподавателей

Правильно? Если да, то идем дальше.

Согласно первому попавшемуся документу по REST роуты будут называться так:

  1. /kafedras
  2. /kafedras/:id
  3. /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 лайка