[英]Node (Express) / React app only works locally
I have a simple Node / React app, which runs fine using heroku local
. 我有一个简单的Node / React应用程序,使用
heroku local
可以正常运行。
The Node backend has an /api/users
endpoint, which returns some hardcoded JSON. Node后端有一个
/api/users
端点,该端点返回一些硬编码的JSON。
After heroku local
, visiting localhost:5000/users
works as expected, displaying the hardcoded users as per the Users.js
React component. 在
heroku local
,访问localhost:5000/users
将按预期工作,并根据Users.js
React组件显示硬编码用户。
However, when pushed to Heroku, only the /
root page works. 但是,当推送到Heroku时,仅
/
根页面有效。 Going to /users
shows Not Found
, and going to /api/users
returns the JSON. 转到
/users
显示Not Found
,转到/api/users
将返回JSON。
I'm not sure why it works locally and not on Heroku, any help is appreciated. 我不确定为什么它可以在本地而不是在Heroku上运行,因此不胜感激。
var express = require('express');
var router = express.Router();
var path = require('path');
router.get('/api/users', function(req, res, next) {
res.json([{id: 1, name: 'Colin'}, {id: 2, name: 'Spodie'}])
});
module.exports = router;
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 cors = require('cors');
var config = require('./config/dev')
var index = require('./routes/index');
var app = express();
app.use(cors())
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
// serve static files from React
app.use(express.static(path.join(__dirname, '../frontend/build')));
// 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 : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
import React, { Component } from 'react';
import { Switch, Route } from 'react-router-dom';
import Users from './Users';
import NotFound from './NotFound';
import Home from './Home';
class App extends Component {
state = {users : []}
render() {
return (
<div>
<Switch>
<Route exact path='/' component={Home}/>
<Route exact path='/users' component={Users}/>
<Route component={NotFound} />
</Switch>
</div>
);
}
}
export default App;
const api = process.env.BACKEND_URL || 'http://localhost:5000'
export const getUsers = () => (
fetch(`${api}/api/users`)
.then(res => res.json())
)
{
"name": "frontend",
"version": "0.1.0",
"private": true,
"dependencies": {
"react": "^15.6.1",
"react-dom": "^15.6.1",
"react-router-dom": "^4.2.2",
"react-scripts": "1.0.12"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
},
"proxy": "http://localhost:5000"
}
Home page running locally 主页在本地运行
Home page running on Heroku 在Heroku上运行的主页
Users page running locally 在本地运行的用户页面
Users page running on Heroku 在Heroku上运行的用户页面
You are serving static files but you also need to forward all HTTP GET requests to client side react router so it can handle. 您正在提供静态文件,但还需要将所有HTTP GET请求转发到客户端react路由器,以便它可以处理。 You may want to put this route to your
app.js
: 您可能希望将此路由放入您的
app.js
:
app.get("*", function (req, res) {
res.sendFile(__dirname + "/path/to/index.html")
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.