2017-10-21 2 views
1

私はExpressでちょっとした作業をしましたが、Reactには新しいことがあります。 Reactはすでに動作しているExpressサーバに接続していますが、私のExpress Appコンポーネントのfetch('/')をExpressアプリケーションのインデックスルートに当てるのに問題があります。たとえば、私はExpressでこれらのルートを持っています:×React - フェッチ( '/')はExpress.routerのインデックスルートにヒットしません

app.use('/', routes); 
app.use('/users', users); 

両方のルートはExpressで同じです。彼らはMongoDBへの簡単な呼び出しを行い、応答はres.json(data)です。また、エクスプレスポートでこれらのルートを純粋にテストすると、両方とも正常に動作します。

以下は私のReactコンポーネントです。問題は、fetch('/')を使用してExpressに対応するapp.use('/', routes);をヒットさせようとするときです。私がfetch('/users')に変更すると動作します。もちろん

import React, { Component } from 'react'; 
import './App.css'; 

class App extends Component { 
    state = {users: []} 

    componentDidMount() { 
    fetch('/') // this route doesn't work with Express! 
     .then(res => res.json()) 
     .then(users => this.setState({ users })); 
    } 

    render() { 
    return (
     <div className="App"> 
     <h1>Users</h1> 
     {this.state.users.map(user => 
      <div key={user.id}>{user.username}</div> 
     )} 
     </div> 
    ); 
    } 
} 

export default App; 

私は('/index')か何かにインデックスのルート名を変更する可能性が、私はすべての可能であればExpressのアプリで('/')ルートとしてそれを維持したいと思います。

私が間違ってやっていることを指摘できれば、私は試してみることができます。私は感謝します。前もって感謝します!フロントエンドアプリで

+1

私の理解していないことは、フロントエンドアプリケーションはどのようにサービスされていますか?アプリケーション(ルートに存在すると想定している)とフェッチしようとしているデータのルートの場所との間に矛盾はありませんか? ''/''を取り出すことも可能ですか? – Jaxx

+0

Reactアプリは、私のExpressアプリケーションのルートにある 'client'というフォルダにあります。私はReactアプリケーションのpackage.jsonに '' proxy ":" http:// localhost:3001 "'(私のExpressアプリケーションがホストされているポートです)を使用しています。私は 'http:// localhost:3000'でReactアプリケーションを実行し、Expressを起動して、' fetch( '/') 'を使わない限りすべて正常に動作します。だから多分あなたは何かを打ったことがあるかもしれません。おそらく、私がフェッチで呼び出しようとしている、ReactのルートとExpressルートの間に矛盾がありますか? – mikeym

+0

そのプロキシ設定を削除して、代わりに 'fetch(" http:// localhost:3001/")'を実行して、動作しているか確認してください。そして、はい、間違いなく紛争が起こっています。 – Jaxx

答えて

1

http://localhost:3000から提供されていると、あなたのバックエンドデータAPIはhttp://localhost:3000でデータを要求しますfetch('/')をやって、http://localhost:3001から提供しました。

フロントエンドに'proxy'パラメータが設定されている場合、それは変更されません。このパラメータは、例えば、Reactアプリではなく、発信リクエストを実行するノードアプリで使用されます。

フロントエンドからバックエンドデータを取得するには、fetch('http://localhost:3001/')を実行する必要があります。あなたの中

// general config goes here 
const configGlob = {}; 
// production specific config goes here 
const configProd = { 
    API_URI: "http://www.example.com/api/v2" 
}; 
// development specific config goes here 
const configDev = { 
    API_URI: "http://localhost:3001" 
}; 

// merged config 
const config = { ...configGlob, process.env.NODE_ENV === 'production' ? ...configProd : ...configDev }; 
export default config; 

そして:あなたが繰り返しを避けるために、生産の準備をしたい場合は、つまり、あなたのクライアントのソースツリーのルートに配置config.jsファイル、別のファイルにあなたのAPIベースURIを定義することができますApp.js

+0

'fetch( 'http:// localhost:3001 /')'に変更すると、トリックありがとう。私がしなければならなかった唯一のことは、バックエンドでCORSを有効にすることでした。誰もが同じエラーを取得する場合は、次のコードで修正する必要があります。 { res.header( "Access-Control-Allow-Origin"、 "*"); res。ヘッダー(「アクセス制御許可ヘッダー」、「発信元、X-Requested-With、Content-Type、Accept」)。 next(); }}); ' – mikeym

関連する問題