【问题标题】:POST request from react child component in express来自快速反应子组件的 POST 请求
【发布时间】:2019-01-05 13:15:28
【问题描述】:

我正在为我的程序使用 MERN 堆栈(带有 react-router 和 redux)。 在我的应用程序中,我有一个<Navbar /> 组件以及一个<SearchBar> 组件。

我使用 create-react-app 来处理反应方面的事情,我相信你们都知道,一切最终都包含在 App.js 中 在 App.js 中,Navbar 在 react router switch 语句之外,就像这样。

 <Provider store={store}>
  <Router>
    <div>
   <NavBarContainer />
   <Switch>  
      <Route exact path="/" component={Homepage} />
      <Route exact path="/ProfilePage" component={ProfilePageContainer} />   
      <Route exact path="/SearchPage" component={SearchPageContainer} />     
      <Route exact path="/LoginPage" component={LoginContainer} />
   </Switch>
 </div>
 </Router>
 </Provider>

我的问题是SearchBar 是Navbar 的子组件,就像这样。

class Navbar extends Component {
  render(){
    return (
    ***navbar stuff
    {this.props.loggedIn && <SearchBar />} 
    ***navbar stuff
    )
  }
}

当我尝试像这样从&lt;SearchBar /&gt; 发出 POST 请求时:

addSearch = (event) => {
  if(this.props.loggedIn){
    fetch('/api/SearchPage', {
      headers : {
        "Accept" : "application/json",
        "Content-Type" : "application/json"       
      },
      method :  'POST',
      body : JSON.stringify({
        username : this.props.username,
        search : this.search.value
      }).then(function(value){
        return value.json()})
      .then(function(data){
        console.log("SearchData", data)
      }).bind(this) 
    })
  }
}

其中addSearch() 在SearchBar 中与onClick(this.addSearch) 一起调用。

当我这样做时,POST 请求来自在我的Navbar 下呈现的任何页面!

我的页面说: Cannot POST /api/[Pagename}.js

当前在Navbar 下渲染的任何页面都将替换[Pagename]

我怎样才能让&lt;SearchBar /&gt; 在自己内部创建一个 POST 请求? 或者,如果这不可能,我如何在 &lt;Navbar&gt; 组件中包含该发布请求?

我正在考虑的事情是,它与我正在使用正文解析器的事实有关,并且页面的当前正文恰好是加载的任何页面。但是,我似乎在 POST 请求中定义了正文:所以这没有多大意义。

现在,我只是将&lt;SearchBar&gt; 组件的所有代码和逻辑放在&lt;Navbar&gt; 和搜索页面中,但我怀疑有更好的方法来做到这一点(虽然将&lt;SearchBar&gt; 留在自己的组件中)。 理想情况下,我只想从&lt;SearchBar&gt; 发送一个 POST 请求。

我知道我可能在这里遗漏了一些常见的东西。

这里是 express 文件中的端点(它只是为了测试而设置的)

```
 app.post('/api/SearchPage', function(req, res done){  
  if(err) done(err);
  done(null, res.json({"Test" : "testobj"}))
}'
```   

【问题讨论】:

  • 您没有针对 Express 端点发出 POST 请求。您正在针对 React 组件执行此操作,这是不可能的。
  • 我是怎么做到的?我的 fetch 方法转到 /api/SearchPage,我的节点文件有一个 app.post('/api/SearchPage') 侦听器。我假设因为 是一个子组件,所以你说它存在于父组件的上下文中,并且永远不会被 express “看到”。但是,我已经尝试将所有逻辑从 进入一个完全不同的页面,我得到相同的结果。
  • 请添加上述端点的代码,然后编辑原始帖子。
  • 刚刚添加到页面中。

标签: javascript node.js reactjs express redux


【解决方案1】:

从给定的代码看来,fetch() 中的 url 似乎是这里的问题。由于您只是在声明 '/app/SearchPage',因此假定它是 React 应用程序的一部分(它不是,因为它应该到达您的 API 端点)。

您应该尝试插入端点的 url。 Is 有时运行在与 React 应用程序不同的端口上(取决于您的设置)。端点可以是 http://localhost:3050/api/SearchPage 之类的东西,应该在 fetch() 方法的 URL 参数中设置。

【讨论】:

  • 好吧,我同时使用 react-router 和 react 的代理。这是我的设置。我的程序中有2个package.json文件,其中一个位于http://localhost:3000,另一个位于http:localhost:8080 package.json中有一行"proxy : "http://localhost:8080"。由于我使用的是 react-router,因此我的 node.js 文件包含默认为 index.html 的行,它实际上指向 App.js。如果我错了,请纠正我,但如果我将 URL 定向到 localhost:8080,那么它不只适用于这个例子吗?如果我尝试在 heroku 或 glitch 等托管平台上托管它怎么办?
  • 顺便说一句,我尝试只使用http://localhost/api/SearchPage 并且成功了!` 这样,我认为 react 会自动将其降低到默认值(3000)并代理到服务器(8080)
  • 但是,当 是子组件时,这并没有解决问题。当所有搜索栏逻辑都被移植到我的 NavBar 文件中时,它也没有解决问题。我现在知道它与反应路由器或正文解析器有关。我的猜测是正文解析器。
  • 尝试更明确,将整个网址放在fetch() 中,从而绕过代理。像这样:fetch('http://localhost:8080/api/SearchPage')...。如果 MERN 包含在 Docker 中,那么您应该可以在任何地方托管它,因为它是隔离的。
【解决方案2】:

我今天休息了,但现在答案似乎很明显。 当我执行 fetch() 时,所有反应都是将 URL(在本例中为 /API/Page)附加到 localhost/[pageimon] 因为我的所有路由都是由 react 路由器在客户端处理的,所以我的 URL 是我所在的任何页面。 (我没有用快递做任何路由)。 由于导航栏在所有切换之外(故意),因此其中包含的任何内容都不会发出成功的发布请求,因为所有 fetch 调用都只会读取 URL。

所以我必须想办法绕过这个(可能是一个 fetch 参数,或者一个 react 中间件模块)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 2020-12-25
    • 2020-07-01
    • 2016-07-12
    • 1970-01-01
    相关资源
    最近更新 更多