React / React-Router / Express / Heroku проблема маршрутизации - PullRequest
0 голосов
/ 25 октября 2018

Я развернул приложение React / Express на Heroku.Я использую BrowserRouter.Все работало хорошо локально.Моя проблема в том, что внутренние маршруты не работают.Единственный маршрут, который работает, это универсальный маршрут.По какой-то причине этот маршрут также вызывается трижды.Я консоль зарегистрировал путь запроса, используя req.path, чтобы увидеть, какой путь вызывалсяЭто должен был быть / google.Вместо этого три вызова дают три разных журнала для req.path.Это: /static/css/main.814455d3.chunk.css.map, /static/js/main.06bdb7f0.chunk.js.map, /static/js/1.1baafe13.chunk.js.карта'.Я надеюсь, что кто-то может помочь.

Я застрял на целый день.Вот мой package.json и static.json со стороны клиента:

static.json

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

package.json

{
  "name": "workout_tracker",
  "version": "0.1.0",
  "private": true,
   "dependencies": {
     "axios": "^0.18.0",
      "jw-paginate": "^1.0.2",
      "jw-react-pagination": "^1.0.7",
       "normalize.css": "^8.0.0",
      "query-string": "^6.2.0",
      "random-id": "0.0.2",
      "react": "^16.5.2",
      "react-dom": "^16.5.2",
      "react-headroom": "^2.2.2",
       "react-icons-kit": "^1.1.6",
      "react-redux": "^5.0.7",
      "react-router-dom": "^4.3.1",
       "react-scripts": "^2.0.5",
      "react-swipe-to-delete-component": "^0.3.4",
      "react-swipeout": "^1.1.1",
      "redux": "^4.0.0",
      "redux-thunk": "^2.3.0"
    },
   "scripts": {
     "start": "react-scripts start",
    "build": "react-scripts build",
     "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
    },

      "devDependencies": {
        "redux-devtools-extension": "^2.13.5"
        },
       "proxy":"localhost:4000",
     "browserslist": [
         ">0.2%",
         "not dead",
         "not ie <= 11",
        "not op_mini all"
    ]

   }

И это мой пакет.json from express

     {
  "name": "expresstest",
  "version": "1.0.0",
  "description": "app to test express and mysql",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start":"node app.js",
    "heroku-postbuild": "cd client && npm install && npm run build"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.18.3",
    "connect-flash": "^0.1.1",
    "cookie-session": "^2.0.0-beta.3",
    "cors": "^2.8.4",
    "express": "^4.16.3",
    "mysql": "^2.16.0",
    "passport": "^0.4.0",
    "passport-google-oauth20": "^1.0.0"
  }
}

Это часть кода с сервера.Я пропустил другие маршруты, так как ни один из них, кроме универсального маршрута, в любом случае не вызывается.

let express = require("express");
let cors= require("cors");
let mysql = require("mysql");
const util = require("util");
const keys = require("./config/keys");
const passport = require("passport");
const passportSetup = require("./config/passport-setup");
const bodyParser = require("body-parser");
const flash= require("connect-flash");
const path= require("path");

console.log("process env");
console.log("-------");
console.log(process.env.PWD);

const cookieSession = require("cookie-session");

let app = express();
app.use(bodyParser.json());


app.use(cookieSession({
    maxAge:24 * 60 * 60 * 1000,
    keys:[keys.session.cookieKey]   
}));

app.use(passport.initialize());
app.use(passport.session());

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

let connection =keys.connection;

app.get("/google", passport.authenticate("google",{

    scope:['profile'],
    failureFlash:"failure"

}),(req,res)=>{
    // console.log(req.flash());
    console.log("/google route");
});


const port = process.env.PORT || 4000;
let http = require("http");
let server = http.createServer(app,(req,res)=>{
    res.writeHead(200, {"Access-Control-Allow-Origiin": "*"})
});

app.get('/*', (req, res) => {
    console.log("catchall");
    console.log(req.hostname);
    console.log(req.path);
    console.log(path.join(__dirname + '/client', 'build', 'index.html'));
  res.sendFile(path.join(__dirname + '/client', 'build', 'index.html'));
})

server.listen(port, ()=>{
    console.log("Listening on "+ port)
});

Вот моя структура папок:

Ссылка на изображение структуры моей папки

РЕДАКТИРОВАТЬ: Я получил это работает, вот код, который работает.Я не знаю, почему это работает, хотя.Я только что попробовал кое-что, что нашел в блогах для проектов React / Express / Heroku.Если кто-нибудь может сказать мне, почему это работает, это будет с благодарностью.

let express = require("express");
let cors= require("cors");
let mysql = require("mysql");
const util = require("util");
const keys = require("./config/keys");
const passport = require("passport");
const passportSetup = require("./config/passport-setup");
const bodyParser = require("body-parser");
const flash= require("connect-flash");
const path= require("path");

console.log("process env");
console.log("-------");
console.log(process.env.PWD);

const cookieSession = require("cookie-session");



let app = express();
app.use(bodyParser.json());
app.use(express.static(__dirname));


app.use(cookieSession({
    maxAge:24 * 60 * 60 * 1000,
    keys:[keys.session.cookieKey]   
}));


app.use(passport.initialize());
app.use(passport.session());

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




let connection =keys.connection;


app.get("/google", passport.authenticate("google",{

    scope:['profile'],
    failureFlash:"failure"

}),(req,res)=>{
    // console.log(req.flash());
    console.log("/google route");
});


const port = process.env.PORT || 4000;
let http = require("http");
let server = http.createServer(app,(req,res)=>{
    res.writeHead(200, {"Access-Control-Allow-Origiin": "*"})
});

app.get("/service-worker.js", (req, res) => {
  res.sendFile(path.join(__dirname + "/client","build", "service-worker.js"));
});

app.get('/*', (req, res) => {
    console.log("catchall");
    console.log(req.hostname);
    console.log(req.path);
    console.log(path.join(__dirname + '/client', 'build', 'index.html'));
  res.sendFile(path.join(__dirname + '/client', 'build', 'index.html'));
})

server.listen(port, ()=>{
    console.log("Listening on "+ port)
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...