Проблема с несколькими маршрутами в одном файле - только два из трех работают, последний не будет работать - PullRequest
0 голосов
/ 16 апреля 2020

Я работаю над созданием API с использованием express и MySQL. У меня проблемы с моими маршрутами. У меня есть это в отдельной папке, требуя различные файлы контроллера и экспортируя маршрутизатор в конце. Вот проблема. Последняя функция router.get не будет работать. Я могу поменять его, и все, что осталось, не сработает. Я вернусь пустой массив. Я в растерянности относительно того, что может быть не так. Вот мой код, файл маршрутов:

const express = require('express');
const router = express.Router();

const getEmployeesController = require('../controllers/getEmployees');
const getEmployeesByIdController = require('../controllers/getEmployeesById');
const getEmployeesByFirstNameController = require('../controllers/getEmployeesByFirstName');



router.get('/', getEmployeesController.getEmployees);

router.get('/:id', getEmployeesByIdController.getEmployeesById);

router.get('/:first_name', getEmployeesByFirstNameController.getEmployeesByFirstName);


module.exports = router;

Маршрутизатор 'first_name' работал, когда он был вторым, после '/', но теперь это не так. То же самое с 'id', работает, когда его второй, но не когда он третий.

Вот функция контроллера, например, одна:

const mysql = require('mysql')
const pool = require('../mysql/connection')
const { handleSQLError } = require('../mysql/error')

const getEmployeesById = (req, res) => {
  let sql = "SELECT ?? FROM ?? WHERE ?? = ?"
  sql = mysql.format(sql, ['*', 'employees', 'emp_no', req.params.id])

  pool.query(sql, (err, rows) => {
    if (err) return handleSQLError(res, err)
    return res.json(rows);
  })
}

  module.exports = { getEmployeesById };

1 Ответ

0 голосов
/ 16 апреля 2020

/:first_name и /:id совпадают с одинаковыми URL-адресами, поэтому только первый зарегистрированный пользователь получит все соответствующие URL-адреса. Они оба соответствуют /anything.

Вы действительно не можете определять такие маршруты. Express не знает, какой обработчик маршрута, который вы хотите использовать с /anything, является запрошенным URL.

Вместо этого вам нужно определить структуру маршрута, в которой эти два типа URL различаются, и вы можете создать обработчик маршрута, который будет уникально поймать каждого. Лично я никогда не использую подобные маршруты подстановочных знаков верхнего уровня, потому что они соответствуют каждому URL верхнего уровня и запрещают вам использовать URL верхнего уровня для любых других целей на вашем сайте.

Вместо этого вы можете изменить свой дизайн URL чтобы сделать это:

router.get('/id/:id', ...)
router.get('/firstname/:firstname', ...);

Тогда из URL будет совершенно ясно, какой тип ресурса запрашивается, и каждый маршрут будет соответствовать только соответствующим URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...