将 mern 应用程序部署到 heroku 后的路由问题
problem with routing after deploying mern app to heroku
我制作了一个锻炼追踪器 MERN 堆栈应用程序,当我 运行 npm start 时,它在我的本地计算机上一切正常(它连接到服务器,我可以添加用户、锻炼等)
但是当我将它部署到 heroku 时,我可以看到 React 前端,但我无法创建用户、练习等
有谁知道为什么?
我认为我的一个组件中的 axios 可能存在问题,因为我使用的是 localhost url 而不是 heroku 组件。但我不知道如何使用 heroku one。
这是我的创建用户组件:
import React, {Component} from 'react';
import axios from 'axios';
export default class CreateUser extends Component {
constructor(props) {
// need to call super() for constructors of subclass in javascript
super(props);
// ensure that "this" is referring to the right object
this.onChangeUsername = this.onChangeUsername.bind(this);
this.onSubmit = this.onSubmit.bind(this);
// use state to create variables in React
this.state = {
username: '',
}
}
onChangeUsername(e) {
this.setState({
username: e.target.value
})
}
onSubmit(e) {
//prevent default HTML behaviour
e.preventDefault();
const user = {
username: this.state.username,
}
console.log(user);
// connect backend to frontend
// second parameter of axios statement is the body
// 'user' is from users.js
axios.post('http://localhost:5000/users/add', user)
.then(res => console.log(res.data));
// once the user enters a username, make the username box blank again, staying on the same page
this.setState({
username: ''
})
}
render() {
return (
<div>
<h3>Create New User</h3>
<form onSubmit={this.onSubmit}>
<div className="form-group">
<label>Username: </label>
<input type="text"
required
className="form-control"
value={this.state.username}
onChange={this.onChangeUsername}
/>
</div>
<div className="form-group">
<input type="submit" value="Create User" className="btn btn-primary" />
</div>
</form>
</div>
)
}
}
这是我的server.js
// tools we need
const express = require('express');
const cors = require('cors');
// mongoose helps connect to mongodb database
const mongoose = require('mongoose');
// setting up server
const app = express();
const port = process.env.PORT || 5000;
const path = require("path")
// cors middeware
app.use(cors());
// helps to parse json
app.use(express.json());
const exercisesRouter = require('./routes/exercises');
const usersRouter = require('./routes/users');
// whenever go to that url, it will load everything in the second parameter
app.use('/exercises', exercisesRouter);
app.use('/users', usersRouter);
mongoose.connect(process.env.MONGODB_URI || "mongodb://***:***1@ds227525.mlab.com:27525/heroku_wgczpk05", {
//dealing with updates to mongodb
useNewUrlParser: true,
useCreateIndex: true,
useUnifiedTopology: true
}
);
if (process.env.NODE_ENV === 'production') {
app.use(express.static( 'client/build' ));
app.get('*', (req, res) => {
res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html')); // relative path
});
}
//app.use(express.static(path.join(__dirname, "client", "build")))
// starts listening and starts the server
app.listen(port, () => {
console.log(`Server is running on port: ${port}`);
});
请注意,为了 post,我的 mongodb uri 已将我的用户名和密码加星号。在我自己的文件中,我有我的用户名和密码
好吧,问题是一旦应用程序部署到 Heroku
或任何其他平台,就没有 localhost
的概念。localhost
只存在于您的本地环境中。所以你的 axios 应该发送请求到
axios.post('/users/add', user)
而不是
axios.post('http://localhost:5000/users/add', user)
因为所有东西都在一个端口上 运行,而 axios 会自动将路由附加到 URL。
我的意思是如果你的 heroku 应用 运行
scott.herokuapp.com
(示例),
一旦调用该路线,您的 URL 将是 scott.herokuapp.com/users/add
。
我制作了一个锻炼追踪器 MERN 堆栈应用程序,当我 运行 npm start 时,它在我的本地计算机上一切正常(它连接到服务器,我可以添加用户、锻炼等) 但是当我将它部署到 heroku 时,我可以看到 React 前端,但我无法创建用户、练习等 有谁知道为什么? 我认为我的一个组件中的 axios 可能存在问题,因为我使用的是 localhost url 而不是 heroku 组件。但我不知道如何使用 heroku one。 这是我的创建用户组件:
import React, {Component} from 'react';
import axios from 'axios';
export default class CreateUser extends Component {
constructor(props) {
// need to call super() for constructors of subclass in javascript
super(props);
// ensure that "this" is referring to the right object
this.onChangeUsername = this.onChangeUsername.bind(this);
this.onSubmit = this.onSubmit.bind(this);
// use state to create variables in React
this.state = {
username: '',
}
}
onChangeUsername(e) {
this.setState({
username: e.target.value
})
}
onSubmit(e) {
//prevent default HTML behaviour
e.preventDefault();
const user = {
username: this.state.username,
}
console.log(user);
// connect backend to frontend
// second parameter of axios statement is the body
// 'user' is from users.js
axios.post('http://localhost:5000/users/add', user)
.then(res => console.log(res.data));
// once the user enters a username, make the username box blank again, staying on the same page
this.setState({
username: ''
})
}
render() {
return (
<div>
<h3>Create New User</h3>
<form onSubmit={this.onSubmit}>
<div className="form-group">
<label>Username: </label>
<input type="text"
required
className="form-control"
value={this.state.username}
onChange={this.onChangeUsername}
/>
</div>
<div className="form-group">
<input type="submit" value="Create User" className="btn btn-primary" />
</div>
</form>
</div>
)
}
}
这是我的server.js
// tools we need
const express = require('express');
const cors = require('cors');
// mongoose helps connect to mongodb database
const mongoose = require('mongoose');
// setting up server
const app = express();
const port = process.env.PORT || 5000;
const path = require("path")
// cors middeware
app.use(cors());
// helps to parse json
app.use(express.json());
const exercisesRouter = require('./routes/exercises');
const usersRouter = require('./routes/users');
// whenever go to that url, it will load everything in the second parameter
app.use('/exercises', exercisesRouter);
app.use('/users', usersRouter);
mongoose.connect(process.env.MONGODB_URI || "mongodb://***:***1@ds227525.mlab.com:27525/heroku_wgczpk05", {
//dealing with updates to mongodb
useNewUrlParser: true,
useCreateIndex: true,
useUnifiedTopology: true
}
);
if (process.env.NODE_ENV === 'production') {
app.use(express.static( 'client/build' ));
app.get('*', (req, res) => {
res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html')); // relative path
});
}
//app.use(express.static(path.join(__dirname, "client", "build")))
// starts listening and starts the server
app.listen(port, () => {
console.log(`Server is running on port: ${port}`);
});
请注意,为了 post,我的 mongodb uri 已将我的用户名和密码加星号。在我自己的文件中,我有我的用户名和密码
好吧,问题是一旦应用程序部署到 Heroku
或任何其他平台,就没有 localhost
的概念。localhost
只存在于您的本地环境中。所以你的 axios 应该发送请求到
axios.post('/users/add', user)
而不是
axios.post('http://localhost:5000/users/add', user)
因为所有东西都在一个端口上 运行,而 axios 会自动将路由附加到 URL。
我的意思是如果你的 heroku 应用 运行
scott.herokuapp.com
(示例),
一旦调用该路线,您的 URL 将是 scott.herokuapp.com/users/add
。