部署到 Heroku 的 MERN 应用程序无法正常工作

IT技术 node.js reactjs heroku redux
2021-05-19 05:33:04

我已经向 Heroku 部署了一个 MERN 应用程序。当我转到应用程序时,我可以通过我的 API 将数据发布到 MongoDB 数据库,但是,每当我发出GET请求时,Heroku 都会响应:

at=info method=GET path="/api/lists/5b44001a558fe30014e8c43c" host=bootcamp-bucket-list.herokuapp.com request_id=e9b06431-aa30-4811-bf7d-a46720991646 fwd="24.124.88.220" dyno=web.1 connect=0ms service=2ms status=304 bytes=237 protocol=https

我能够在我的服务器上本地运行该应用程序而没有任何问题,只是在我们进行生产时,GET 请求失败。有没有人以前经历过这个并知道是什么导致了这个问题?如果需要任何其他信息,请告诉我。

这是我的server.js文件的设置

const express = require('express');
const path = require('path');

const users = require('./routes/api/users');
const routes = require('./routes');
const app = express();
const port = process.env.PORT || 5001;

const bodyParser = require("body-parser");
const passport = require('passport');
const mongoose = require("mongoose");
const Models = require('./models');
app.use(bodyParser.urlencoded({
  extended: true
}));
app.use(bodyParser.json());

mongoose.Promise = Promise;
var MONGODB_URI = process.env.MONGODB_URI || "mongodb://localhost/testdb";
console.log(MONGODB_URI);
mongoose.connect(MONGODB_URI);
const db = mongoose.connection;

app.use(passport.initialize());

// PASSPORT CONFIG
require('./config/passport')(passport);


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

if (process.env.NODE_ENV === 'production') {
  // Serve any static files
  app.use(express.static('client/build'));
}

// USE ROUTES
app.use('/api/users', users);
app.use(routes);

app.listen(port, () => console.log(`Listening on port ${port}`));

我的package.json文件中还有以下脚本

"start": "node server.js",
"heroku-postbuild": "NPM_CONFIG_PRODUCTION=false npm install --prefix client && npm run build --prefix client"

1个回答

您需要确保在生产模式下运行时保留您的 api 端点。

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

应该是这样的

if (process.env.NODE_ENV === 'production') {
  app.use(express.static('client/build')); // serve the static react app
  app.get(/^\/(?!api).*/, (req, res) => { // don't serve api routes to react app
    res.sendFile(path.join(__dirname, './client/build/index.html'));
  });
  console.log('Serving React App...');
};