express. json () не работает на производстве - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть NodeJS и проект React. У меня проблема. Я не понял, в чем проблемы. Сначала я хочу показать вам, в чем моя проблема.

на локальном хосте. Я хочу вот так на Герою, но он возвращает меня как следующий enter image description here

Фотография моей проблемы:

enter image description here

Как вы видите на фотографии, в моем пользовательском объекте при развертывании Heroku есть файл html.

Но когда я запускаю свой проект на локальном хосте, у пользователя появляется объект, исходящий от моего пользователя. go база данных. Express. json () ловит и корректно работает на локальном хосте, но не работает на Heroku. Почему это происходит? В чем моя проблема?

Вот мой сервер. js file:

const express = require("express");
const path = require("path");
const app = express();
const connectDB = require("./config/db");
const PORT = process.env.PORT || 5000;

connectDB();
app.use(express.json());

app.use(express.json({ extended: false }));
app.use(express.static("client/build"));

if (process.env.NODE_ENV === "production") {
  app.get("*", (req, res) => {
    res.sendFile(path.join(__dirname, "client", "build", "index.html"));
  });
}

app.use("/", require("./routes/quizRoute"));
app.use("/users", require("./routes/userRoute"));
app.use("/auth", require("./routes/authRoute"));

app.listen(PORT, () => {
  console.log("Server is started on the port " + PORT);
});

Запрос на стороне клиента

//SET AUTH WORK
import axios from "axios";

const setAuthToken = token => {
  if (token) {
    axios.defaults.headers.common["x-auth-token"] = token;
  } else {
    delete axios.dafaults.header.common["x-auth-token"];
  }
};

export default setAuthToken;

// LOAD USER

const loadUser = async () => {
    if (localStorage.token) {
      setAuthToken(localStorage.token);
    }
    try {
      const res = await axios.get("/auth");
      dispatch({ type: USER_LOADED, payload: res.data });
    } catch (err) {
      dispatch({
        type: AUTH_ERROR,
        payload:
          "AUTH_ERROR: Token dogrulanamadi veya /auth'a GET isteginde bir sorun var"
      });
    }
  };

enter code here

1 Ответ

1 голос
/ 21 февраля 2020

Почему у вас возникла проблема:
Я считаю, что ваш компоновщик устанавливает значение NODE_ENV на production при сборке для сред развертывания, т.е. Heroku. Таким образом, у вас возникла эта проблема из-за универсального маршрута, который отправляет обратно вашему клиенту index.html при каждом запросе get:

if (process.env.NODE_ENV === "production") {
  app.get("*", (req, res) => {
    res.sendFile(path.join(__dirname, "client", "build", "index.html"));
  });
} 

Следовательно, когда вы делаете запрос get на маршрут /auth из в вашем клиентском приложении запрос перехватывается этим универсальным обработчиком маршрутов перед тем, как перейти к ожидаемому обработчику маршрутов Я почти уверен, что вы получите эту строку HTML всякий раз, когда вы делаете запрос get на свой сервер, а не только для /auth

Решение:
Для этого легко было бы переместить универсальный маршрут ниже маршрутов API, например:

app.use("/", require("./routes/quizRoute"));
app.use("/users", require("./routes/userRoute"));
app.use("/auth", require("./routes/authRoute"));

// Every other API or similar routes should be before this catch-all
if (process.env.NODE_ENV === "production") {
  app.get("*", (req, res) => {
    res.sendFile(path.join(__dirname, "client", "build", "index.html"));
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...