2017-08-29 11 views
1

したがって、expressの例外を除いてうまく動作している反応プロジェクトがあります。明示的にルーティングしてMERNスタックチュートリアルを見つけるのは難しいことでした。React/Expressは正しくリンクをリンクしていません

私はいくつかのSOの投稿を見つけましたが、私のプロジェクトでは機能しません。私がエクスプレスで反応ルートに誰かをリンクさせると、私は「見つからない」ことになる。私は周りの公平なミドルウェアをコメントしたので、これを周りに混乱させてきた。

Project Structurte 

Root 
     package.json 
    Server 
     Routes 
      index.js 
    app.js 
    package.json 
    Client 
     Build 
     Public 
     Src 

App.js

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var compression = require('compression') 
var session = require('express-session'); 

var index = require('./routes/index'); 
var root = require('./routes/root') 

var app = express(); 


app.use(compression({level: 9})) 

app.engine('html', require('ejs').renderFile); 
app.set('view engine', 'html'); 
app.use(logger('dev')); 

app.use(function(req, res, next) { 
res.setHeader('Cache-Control', 'no-cache'); 
next(); 
}); 

app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
//app.use(express.static(path.join(__dirname, 'public'))); 
//app.use(express.static(path.join(__dirname, '../client/build'))); 

app.use('/', root) 
app.use('/api', index); 


// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handler 
app.use(function(err, req, res, next) { 
    // set locals, only providing error in development 
    res.locals.message = err.message; 
    res.locals.error = req.app.get('env') === 'development' ? err : {}; 
    console.error(err) 
    // render the error page 
    res.status(err.status || 500); 
    res.send(err.message) 
}); 

process.on('uncaughtException', function (err) { 
    console.log(err); 
}) 


module.exports = app; 

Root.js

var express = require('express'); 
var router = express.Router(); 


router.get('*', function(req,res){ 
    console.log('fire') 
     res.sendFile(__dirname, '../../client/build/index.html') 
    }) 

は、クライアントSRC内のルートに反応

import React from 'react'; 
import { Route, Switch } from 'react-router-dom' 
import {Home} from './Home' 
import {NotFound} from './NotFound' 

import {Header} from './Header' 
import {Foot} from './Footer' 
import {StepOne} from './StepOne' 
import {StepTwo} from './StepTwo' 
import {Checkout} from './Checkout' 
import {SubHead} from './SubHead' 
import {Product} from './Product' 

import {Thankyou} from './Thankyou' 

export const App =() => (
    <div> 

    <Header /> 
    {/* <SubHead /> */} 
    <main> 
     <Switch> 
     <Route exact path="/" component={Home} /> 
     <Route exact path="/stepone" component={StepOne} /> 
     <Route exact path="/steptwo" component={StepTwo} /> 
     <Route exact path="/checkout" component={Checkout} /> 
     <Route exact path='/thankyou' component={Thankyou} /> 
     <Route path='/crates/:crate' component={Product} /> 
     <Route component={NotFound} /> 
     </Switch> 
    </main> 

    <Foot /> 

    </div> 
) 

APIは関係ありません。..

どうすればこの問題を解決できますか?

+0

あなたはこれを追加するように、ルートで何かをエクスポートする必要がありますファイルの終わりです:module.exports = router; –

+0

ああ、ありがとう@JeffBreadner。小規模な監視。これを回答として追加すると、私はupvoteして受け入れます。 – Quesofat

答えて

1

require()のすべてのファイルにmodules.exportが含まれていることを確認してください。この場合、root.jsにこれを追加します。答えとしてこれを受け入れる努力を通過するための

module.exports = router; 

おかげで、それはクールだ;)

0

反応プロジェクトを静的なコンテンツとして追加して、アプリケーションを表現できます。

app.use(express.static('client/build)); // path must be relative to your express app 

// or if you like to make it work on a sub root 
app.use('/reactapp', express.static('client/build')); 

create-react-appを使用してプロジェクトを作成した場合は、エクスプレスアプリ用のreactプロジェクトpackage.jsonファイルプロキシを追加する必要があります。

{ 
    "proxy": "http://localhost:500" // port can change according to your settings 
} 

詳細なチュートリアルhereがあります。また、create-react-appのドキュメントには、ノードでの使用に関するいくつかの情報も含まれています。

関連する問題