可选的反应路由器参数标记 GET 请求错误?

Posted

技术标签:

【中文标题】可选的反应路由器参数标记 GET 请求错误?【英文标题】:Optional React Router Param Flagging GET request Error? 【发布时间】:2020-01-15 08:05:18 【问题描述】:

编辑:发布了我如何解决这个问题的答案,而不是使用 react-router 可选参数。

由于某种原因,当我使用附加到 URL 的可选参数转到可选的 react-router 路由/url 时,我遇到了 GET 错误。我试图通过在 URL 中包含可选参数 SRC 来跟踪用户的来源。我已经尝试了 /ref=testing、/src=testing、/testing 作为 :referrer?他们可能会保存在 localStorage 中,但仍会引发控制台 GET 请求。

这是我的 App.js 的样子:

<Route exact path="/profile/user/:user/:referrer?" component= ProfileById  />

:user 是 mongoose 结构中的用户 ID。 : 推荐人?是 src=(不管它是什么)

这是我对路由的 axios 请求:

export const getProfileByUserId = (user) => dispatch => 
dispatch(setProfileLoading());
axios.get(`/profile/user/$user`)
    .then(res => 
        dispatch(
            type: GET_PROFILE,
            payload: res.data
        )    
    )
    .catch(err => 
        dispatch(
            type: GET_PROFILE,
            payload: null
        )   
    );

这是我运行 axios GET 请求的 componentDidMount() 内部的内容,然后还检查可选参数并将其存储在 localStorage 中。

componentDidMount() 
    if (this.props.match.params.user) 
        this.props.getProfileByUserId(this.props.match.params.user);
    

    if (this.props.match.params.referrer) 
        let referrerString = this.props.match.params.referrer.split('=');
        localStorage.setItem('referrer', referrerString[1])
    

当我加载路由时,假设它:/profile/user/20385h1058h385/ref=testing GET 错误出现为:404 Not found,然后说错误是 /ref=testing 好吧,如果它是一个可选参数而且我实际上并没有在这个可选参数上请求 GET,为什么会出现?

感谢任何帮助,谢谢!

【问题讨论】:

【参考方案1】:

我无法让它与一个可选的参数路​​由一起工作,所以我继续做一个新的 URLSearchParams(),把它变成一个字符串,然后分割这个字符串来识别实际的搜索查询。适用于斜杠路径,例如:/?src=testing 以及附加到现有路径时。

这是我想出的:

if (this.props.location.search) 
        // Check to see if the search address has a location and search query param, if so save in localStorage for referrer source
        //console.log(this.props.location.search);
        let srcParams = new URLSearchParams(this.props.location.search);
        let srcString = srcParams.toString();
        let referrerString = srcString.split('=');
        localStorage.setItem('referrer', referrerString[1]);
    

【讨论】:

【参考方案2】:

请在 URL 中仅附加 testing 而不是 ref=testing。在这种情况下,您的 URL 将是 /profile/user/20385h1058h385/testing

我们将: 用于必需参数,将:parameter_name? 用于可选参数。

例如:

<Route path="/login/:p1/:p2?" component=Login />

这里p1是必填参数,p2是可选参数。

我们在 componentDidMount 方法中得到这些,就像你正在做的那样。

this.props.match.params.p1

【讨论】:

感谢您的回复。我已经尝试在 url 中删除 ref= 或 src= ,并且像你提到的那样做了 /testing 。我又试了一次,还是报 404 GET 错误。 你使用的是哪个版本的 react-router。请同时查看此帖子https://***.com/questions/35604617/react-router-with-optional-path-parameter。到version3,传递参数的方式是一样的,但是version4以后的方式略有不同。 我正在使用 React Router V5。您知道导致 GET 错误的原因吗? @Buckyx55,我今天用 V4 测试了它。它适用于可选参数和必需参数。您可能还有其他问题。

以上是关于可选的反应路由器参数标记 GET 请求错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用可选的查询字符串参数测试 MVC 路由

反应路由器和路由参数

angularjs 路由可以有可选的参数值吗?

typescript 可选的路由参数

typescript 可选的路由参数

Express.js 路由:可选的 splat 参数?