繁体   English   中英

我在 heroku 上的反应应用程序打开主页但不会打开其他页面

[英]My react app on heroku opens home page but will not open other pages

我的 react 应用程序在本地运行良好,并部署到 heroku。 但是,从主页上,任何指向另一个页面的链接都会显示一个空白页面,上面有“未找到”。 没有其他错误消息。

这是我的服务器端 package.json 文件:

{
  "name": "portfolio-generator",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "engines": {
    "node": "12.16.x"
  },
  "dependencies": {
    "axios": "^0.19.2",
    "bootstrap": "^4.5.0",
    "concurrently": "^5.2.0",
    "express": "^4.17.1",
    "if-env": "^1.0.4",
    "mongoose": "^5.9.13",
    "nodemon": "^2.0.4",
    "react-bootstrap": "^1.0.1",
    "react-bootstrap-validation": "^0.1.11",
    "styled-components": "^5.1.0"
  },
  "devDependencies": {},
  "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",
    "build": "cd client && npm run build",
    "heroku-postbuild": "cd client && npm install && npm install --only=dev --no-shrinkwrap && npm run build",
    "seed": "node ./seeders/seed.js",
    "install": "cd client && npm install"
  },
  "repository": {
    "type": "git",
    "url": "git+https://https://github.com/...../jtsy.git"
  },
  "author": "",
  "license": "ISC",
  "bugs": {
    "url": "https://https://github.com/...../jtsy/issues"
  },
  "homepage": "https://https://github.com....../jtsy#readme"
}

这是客户端 package.json:

{
  "name": "portfolio-generator",
  "version": "0.1.0",
  "private": true,
  "proxy": "http://localhost:3001/",
  "dependencies": {
    "@testing-library/jest-dom": "^4.2.4",
    "@testing-library/react": "^9.5.0",
    "@testing-library/user-event": "^7.2.1",
    "axios": "^0.19.2",
    "bootstrap": "^4.4.1",
    "react": "^16.13.1",
    "react-bootstrap": "^1.0.1",
    "react-bootstrap-validation": "^0.1.11",
    "react-dom": "^16.13.1",
    "react-router-dom": "^5.1.2",
    "react-scripts": "3.4.1",
    "semantic-ui-css": "^2.4.1",
    "semantic-ui-react": "^0.88.2",
    "styled-components": "^5.1.0"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

服务器.js

const express = require("express");
import npm package mongoose, the ODM for mongo database
const mongoose = require("mongoose");
const routes = require("./routes");

const app = express();
// set the port for mongo connection to 3001 in development mode
const PORT = process.env.PORT || 3001;

app.use(express.urlencoded({ extended: true }));
app.use(express.json());

if (process.env.NODE_ENV === "production") {
  app.use(express.static("client/build"));
}

app.use(routes);

// Connect to the Mongo DB (portfolio_db)
mongoose.connect(
  process.env.MONGODB_URI || "mongodb://localhost/portfolio_db",
  {
    useCreateIndex: true,
    useNewUrlParser: true,
    useUnifiedTopology: true,
  }
);


app.listen(PORT, () =>
  console.log(`🌎  ==> API Server now listening on PORT ${PORT}!`)
);

根据一些研究,我添加了一个 static.json 文件:

{
  "root": "build/",
  "clean_urls": false,
  "routes": {
    "/**": "index.html"
  }
}

服务器端的 routes/index.js 中有一个默认路由:

....
router.use("*", (req, res) =>
  res.sendFile(path.join(__dirname, "../client/src/index.html"))
);

module.exports = router;

在 App.js(react top 组件)中,react router 是这样使用的:

...
     <Router>
        <Switch>
          <DevDataContext.Provider value={devDataProvider}>
            <SetupContext.Provider value={setupProvider}>
              {setup.initialized ? (
                <Route exact path="/" component={Home} />
              ) : (
                  <Route exact path="/" component={Signin} />
                )}
              <Route exact path="/contact" component={Contact} />
              <Route exact path="/about" component={About} />
              <Route exact path="/Developer" component={Developer} />
              <Route exact path="/Signin" component={Signin} />
            </SetupContext.Provider>
          </DevDataContext.Provider>
          <Route component={NoMatch} />
        </Switch>
      </Router>
   ...

有了这一切,我处于停顿状态。 主页加载并刷新,但不会重定向到任何地方。

编辑: index.html 的路径是错误的。 它位于“client”下的“public”文件夹中,因此在 routes/index.js 中,它现在是:

 router.use("*", (req, res) =>
      res.sendFile(path.join(__dirname, "../client/public/index.html"))
    );

现在我得到的只是 heroku 页面上的空白屏幕。 我认为我的问题是基于路由的定义方式,但我仍然无法弄清楚。

我的文件夹结构是:

/projectname
  server.js
  package.json
  ...
 /client
    package.json
      /public
        index.html
        ...
      /src
        App.js
        index.js
        ...
          /components
          /pages
 /controllers
 /models
 /routes
    index.js (this is where the path to index.html is defined)
      /api
        index.js
        ...

编辑 #2 解决方案 在 server.js 中进行了一些关键更改。 最重要的是添加“路径”package(新手错误)。 我还必须将“app.use(routes)”放在默认反应路由代码之前,该代码现在位于“生产”代码块之外。

const path = require('path');
const express = require("express");
const mongoose = require("mongoose");
const routes = require("./routes");

const app = express();
// set the port for mongo connection to 3001 in development mode
const PORT = process.env.PORT || 3001;

// Configure body parsing for AJAX requests
app.use(express.urlencoded({ extended: true }));
app.use(express.json());

// Serve up static assets
**if (process.env.NODE_ENV === "production") {
  app.use(express.static("client/build"));
}
app.use(routes);
app.get("*", function (req, res) {
  res.sendFile(path.join(__dirname, "./client/build/index.html"));
});**

// Connect to the Mongo DB (portfolio_db)
mongoose.connect(
  process.env.MONGODB_URI || "mongodb://localhost/portfolio_db",
  {
    useCreateIndex: true,
    useNewUrlParser: true,
    useUnifiedTopology: true,
  }
);

// Start the API server on port 3001
app.listen(PORT, () =>
  console.log(`🌎  ==> API Server now listening on PORT ${PORT}!`)
);

我还删除了 /routes/index.js 中对默认反应路由的引用

找到解决方案。 对 server.js 的 3 处更改。 添加:

const path = require('path')

绝对是一个新手错误,忘记了这一点,此外,修改了代码以将默认反应路线从“生产”代码块中拉出。 并将其放在 'app,use(routes): 下方,例如:

if (process.env.NODE_ENV === "production") {
  app.use(express.static("client/build"));
}
app.use(routes);
app.get("*", function (req, res) {
  res.sendFile(path.join(__dirname, "./client/build/index.html"));
});

我还从 /routes/index.js 中删除了默认的反应路由。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM