所以我构建了一个简单的 mern 应用程序,它可以在我的本地环境中正常工作,但是在部署到 Heroku 时,它可以很好地为 React 应用程序提供服务,但在 API 调用上却出现了 404s。我似乎无法弄清楚这个问题。我正在使用 Axios 发送请求。我检查了网络请求,它们看起来都不错,但仍然返回 404。在 postman 中测试也返回相同的错误。
这是服务器代码......知道为什么会失败吗?
const express = require('express');
const path = require('path');
const Axios = require('axios');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
require('dotenv').config();
const PORT = process.env.PORT || 8080;
const mongoUri = process.env.MONGODB_URI || 'mongodb://localhost:27017/book';
const app = express();
// Define middleware here
app.use(express.urlencoded({ extended: true }));
app.use(bodyParser.json());
// Serve up static assets (usually on heroku)
if (process.env.NODE_ENV === 'production') {
app.use(express.static('client/build'));
}
const { Schema } = mongoose;
const bookSchema = new Schema({
info: Schema.Types.Mixed,
});
const Book = mongoose.model('Book', bookSchema);
app.post('/api/search', (req, res) => {
Axios.get(
`https://www.googleapis.com/books/v1/volumes?q=${req.body.term}`
).then(books => res.json(books.data.items));
});
app.post('/api/save', (req, res) => {
const newBook = new Book({ info: req.body.book });
newBook.save(err => {
if (err) res.json(err);
res.json({ status: true });
});
});
app.post('/api/unsave', (req, res) => {
Book.findByIdAndRemove(req.body.book._id, err => {
if (err) res.json(err);
res.json({ status: true });
});
});
app.get('/api/saved', (req, res) => {
Book.find({}, (err, books) => {
if (err) res.json(err);
res.json(books);
});
});
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, './client/build/index.html'));
});
mongoose.connect(mongoUri, { useNewUrlParser: true });
const db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
console.log('connected');
});
app.listen(PORT, () => {
console.log(`🌎 ==> API server now on port ${PORT}!`);
});
这是我的 package.json
{
"name": "google-book",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"start": "if-env NODE_ENV=production && npm run start:prod || npm run start:dev",
"start:prod": "node server.js",
"start:dev": "concurrently \"nodemon --ignore 'client/*'\" \"npm run client\"",
"client": "cd client && npm run start",
"install": "cd client && npm install",
"build": "cd client && npm run build",
"heroku-postbuild": "npm run build"
},
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^0.19.2",
"body-parser": "^1.19.0",
"concurrently": "^5.1.0",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"mongodb": "^3.5.3",
"mongoose": "^5.9.1"
}
}
我的react路线以防万一
return (
<div className="app">
<Header />
<Router>
<Route exact path='/'>
<Searchbar search={search} setSearch={setSearch} />
{!search.term ? (
<div className="message">
<p>Search for a book or whatever</p>
</div>
) : <SearchList results={search.results} />}
</Route>
<Route path='/saved'>
<h2 className="title">Saved Books</h2>
<SavedList />
</Route>
<Footer />
</Router>
</div>
);