【问题标题】:How to get the route link work with same text?如何让路由链接使用相同的文本?
【发布时间】:2021-12-06 10:22:19
【问题描述】:

我不知道如何更好地问这个问题,所以我有这条路线。我有 details/user_id 和 detail/id 但是当我将它们都设为详细信息时……看起来它并不关心主要路线下方的路线。如何区分 details/id 和 details/user_id?

const router = require('express').Router();
const db = require('../models');

// Get details by user_id
router.get('/details/:user_id', (req, res) => {
    try {
        db.Customer.findAll({
            where: {
                user_id: req.params.user_id,
            },
        }).then((user) => res.send(user));
    } catch (err) {
        res.status(500).json(err);
    }
});

// Get details by id
router.get('/detail/:id', (req, res) => {
    try {
        db.Customer.findAll({
            where: {
                id: req.params.id,
            },
        }).then((user) => res.send(user));
    } catch (err) {
        res.status(500).json(err);
    }
});

module.exports = router;

【问题讨论】:

    标签: node.js express routes


    【解决方案1】:

    如果参数不同/相同类型你应该使用不同的路由

    例如:

    router.get('/details/users/:user_id', (req, res) => {
        try {
            db.Customer.findAll({
                where: {
                    user_id: req.params.user_id,
                },
            }).then((user) => res.send(user));
        } catch (err) {
            res.status(500).json(err);
        }
    });
    

    【讨论】:

    • 我想在两个地方都使用细节,但只是终点不同
    【解决方案2】:

    我认为在某些方面你想要的东西是做不到的。例如,如果您的数据库中有以下架构,

    user_id : uuid

    id: uuid

    你看到他们两个有相同的模式吗?所以路由器会混淆获得任何价值的第一个功能。为什么不使用 Jimmy Soussan 建议的路线,使用 /details/users/:id 这样的路线 对于用户和另一个 /details/rooms/:id。

    但如果你真的想实现类似的东西,我猜你可以通过使用正则表达式来实现。如果您的 id 和 user_id 属于不同类型,那么您可以使用正则表达式来过滤它们。图片的文档如下https://expressjs.com/en/guide/routing.html

    假设您继续尝试使用正则表达式,并且 user_id 是串行类型,id 是 uuid 类型。

    uuid 正则表达式:[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA- F0-9]{4}-[a-fA-F0-9]{12}

    router.get('/details/users/:user_id(\[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}\)', (req, res) => {
    try {
        db.Customer.findAll({
            where: {
                user_id: req.params.user_id,
            },
        }).then((user) => res.send(user));
     } catch (err) {
        res.status(500).json(err);
     }
    });
    

    所以它只有在传递给 url 的值是 uuid 时才会起作用。这样您就可以按其值进行过滤,但请记住,类型是否相等不是很有帮助,因为这些值将遵循相同的模式。您可以使用https://regex101.com/ 之类的在线网站来针对正则表达式测试您的值。

    对您的问题有用的内容:

    https://expressjs.com/en/guide/routing.html

    Searching for UUIDs in text with regex

    https://regex101.com/

    我希望我的回答对我有帮助,并祝你好运。 :)

    【讨论】:

      猜你喜欢
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多