Как использовать несколько маршрутов в ExpressJS? - PullRequest
0 голосов
/ 07 января 2020

Можно ли сделать так, чтобы маршрутизатор в ExpressJS был таким?

пользователей. js

const userController = ('../controllers/userController.js');

router.get('/:userName', userController.paramByUsername);
router.get('/:id', userController.paramByUserId);


В контроллер, код выглядит следующим образом

userController. js

function paramByUsername(req, res) {
    User.findOne({
        where: {
            userId: req.params.userId
        }
    })
    .then((user) => {
        if(!user) {
            return res.status(404).json({ message: "User not found."});
        }

        return res.status(200).json(user);
    })
    .catch((error) => {
        return res.status(400).json(error);
    });
}

function paramByUserId(req, res) {
    User.findByPk(req.params.id)
    .then((user) => {
        if(!user) {
            return res.status(404).json({ message: "User not found."});
        }
    }).catch((error) => {
        return res.status(400).json(error);
    });
}


По приведенному выше коду я хотел достичь конечной точки, как this:
/users/1 этот ответ должен совпадать с /users/username.

Я пробовал код выше, но я вижу ошибку, когда я получаю /users/:id

1 Ответ

1 голос
/ 07 января 2020

Вы не можете сделать оба этих вместе:

router.get('/:userName', userController.paramByUsername);
router.get('/:id', userController.paramByUserId);

С точки зрения чистой маршрутизации, нет никакого способа определить разницу между этими двумя. Какой бы маршрут вы ни объявили первым, вы получите все на верхнем уровне, а второй никогда не попадет.

Таким образом, при разработке маршрута вы ДОЛЖНЫ убедиться, что каждый маршрут уникально распознается для Express сопоставителя маршрутов. основываясь на том, что вы указали в шаблоне маршрута.

Я полагаю, что если id всегда было просто числами, а имя пользователя никогда не могло быть просто числами, то вы могли бы использовать маршрут регулярного выражения и сопоставлять только числа для id и все остальное для имени пользователя, но это мне кажется чуть более agile, и я бы предпочел что-то более явное.

Я не знаю общую картину вашего приложения, но вы Возможно, вы захотите сделать:

router.get('/user/:userName', userController.paramByUsername);
router.get('/id/:id', userController.paramByUserId);

Или вы можете использовать строку запроса с URL-адресами, например:

/search?user=John
/search?id=4889

И тогда у вас будет только один маршрут:

router.get("/search", ....);

И вы должны проверить, какие свойства присутствуют в req.query, чтобы решить, какой элемент вы ищете.

...