2016-12-01 77 views
1

Express服务器这是我的Express服务器设置与之反应前端选择,而无需服务器端渲染

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 mongoose = require('mongoose'); 

var app = express(); 

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


require('./api/accounts/signin')(app); 
.... 

mongoose.connect(process.env.MONGO_URI); 
mongoose.connection.on('error', function() { 
    console.info('Error: Could not connect to MongoDB. Did you forget to run `mongod`?'); 
}); 

app.set('super-secret', process.env.APP_SECRET) 

module.exports = app; 

现在,当我在本地主机开始我的申请:3000 /它正常工作与所有路由工作,但是当我尝试去localhost:3000 /登录或一些其他路线直接我得到Cannot GET /login错误...

我不想用反应中间件(我以前用过)的服务器端渲染,所以反正有使其工作?

app.get('/*/*', function(req, res) { 
    res.sendFile(path.join(__dirname, 'public/index.html')) 
}) 



<!doctype html> 
<html> 
    <head> 
    <meta charset="utf-8"/> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/> 
    <meta name="viewport" content="width=device-width, initial-scale=1"/> 
    <title>Doyouthink?</title> 
    </head> 
    <body> 
    <div id="root"></div> 
    <script src="js/common.bundle.js"></script> 
    <script src="js/polyfill.bundle.js"></script> 
    <script src="js/vendor.bundle.js"></script> 
    </body> 

</html> 

回答

1

你只需要匹配所有路由并为它们提供包含你的包的基本html页面。 React Router然后将检查URL并呈现相应的组件。

app.get("/", handleRender); 
app.get("*", handleRender); 

function handleRender(req, res){ 
    res.sendFile(__dirname + '/index.html'); 
} 
+0

什么将handleRender在这里?这不是一个中间件的反应在某种意义上又名服务器端渲染? – eersteam

+0

对不起,编辑。它只是提供你的索引html文件。 –

+0

好吧,非常感谢你......还有,虽然我们在这样做,是否有必要(在生活中的某个时刻)在单个页面应用程序中插入服务器端渲染,以使其适合搜索引擎优化和类似的东西或我很好没有它? – eersteam