【问题标题】:react-router is not letting Link send a GET request to the serverreact-router 不允许 Link 向服务器发送 GET 请求
【发布时间】:2019-04-09 00:01:07
【问题描述】:

通常我会使用 axios 发送一个 GET 请求,但是在“React 实践课程”教程中,讲师成功地点击了这条路线

app.get('/api/admin/download/:filename', auth, admin, (req, res) => {
    console.log('here I am ', req.params.filename);
    const file = path.resolve('.')+`/uploads/${req.params.filename}`;
    res.download(file);
})

使用此代码中的链接

import {Link} from 'react-router-dom';

showFiles = () => (
    this.state.files &&
    this.state.files.map((filename,i) => (
        <li key={i}>
            <Link   to={`/api/admin/download/${filename}`}
                    target="_blank">
                {filename}
            </Link>
        </li>
    ))
)

正如here 所见,链接与服务器中的路径匹配,但反应路由器将我发送到 PageNotFound 组件,而不是发送 GET 请求。

为了让链接文件到达服务器,我缺少什么?我怀疑问题出在我的路由文件中。

const Routes = () => {
    // null = public route
    return (
        <Layout>
            <Switch>
                <Route path="/admin/add_product" exact component={Auth(AddProduct, true)} />
                <Route path="/admin/manage_categories" exact component={Auth(ManageCategories, true)} />
                <Route path="/admin/manage_site" exact component={Auth(ManageSite, true)} />
                <Route path="/admin/add_file" exact component={Auth(AddFile, true)} />

                <Route path="/user/cart" exact component={Auth(Cart, true)} />
                <Route path="/user/dashboard" exact component={Auth(Dashboard, true)} />
                <Route path="/user/user_profile" exact component={Auth(UpdateProfile, true)} />

                <Route path="/register_login" exact component={Auth(RegisterLogin, false)} />
                <Route path="/register" exact component={Auth(Register, false)} />
                <Route path="/product/:id" exact component={Auth(Product, null)} />
                <Route path="/shop" exact component={Auth(Shop, null)} />
                <Route path="/" exact component={Auth(Home, null)} />
                <Route component={Auth(PageNotFound)} />
            </Switch>
        </Layout>
    )
}

【问题讨论】:

  • 您尝试过添加&lt;Route path="/api/admin/download/:filename" ..... 吗?现在您的路由器中没有任何与该 url 匹配的路由
  • 那条路由不是意味着我想在前端处理路由,而不是将请求传递给服务器吗?
  • 我误会了你。基本上,如果您不希望路由器控制您的链接,您可以在 Link 周围创建自己的包装器,或者只使用常规锚
  • 谢谢。应该提到我已经尝试过 标签并得到了相同的行为。

标签: reactjs react-router-dom


【解决方案1】:

为了扩展我的cmets,我在这里回答。

以下对我有用:

import React from "react";
import { render } from "react-dom";
import { BrowserRouter as Router, Route, Link } from "react-router-dom";

const About = () => <div>About</div>
const Home = () => <div>Home</div>
const Topics = () => <div>Topics</div>

const apiUrl = "http://localhost:9000/api";

const BasicExample = () => (
  <Router>
    <div>
      <ul>
        <li>
          <Link to="/">Home</Link>
        </li>
        <li>
          <Link to="/about">About</Link>
        </li>
        <li>
          <Link to="/topics">Topics</Link>
        </li>
        <li>
          <a href={`${apiUrl}/v1/test`}>Api GET request</a>
        </li>
      </ul>

      <hr />

      <Route exact path="/" component={Home} />
      <Route path="/about" component={About} />
      <Route path="/topics" component={Topics} />
    </div>
  </Router>
);

render(<BasicExample />, document.getElementById("root"));

所以基本上我只是创建了一个&lt;a&gt; 传递正确的href url,它没有落入&lt;Router&gt;,如下所示:https://github.com/ReactTraining/react-router/issues/1147#issuecomment-113180174

您确定将正确的 url 传递给锚的 href 吗?

【讨论】:

  • 谢谢。我可以看到它是如何工作的。现在改变我的整个路由器,看看为什么使用 BrowserRouter 跳过了教程...
  • BrowserRouter 确实在那里,(无法编辑最后一条评论),我很确定我的网址是正确的。试图通过我在原始问题中链接的屏幕截图来证明它是正确的。
猜你喜欢
  • 2022-07-11
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多