Опубликовать запрос от реагирования на приложения, зависшие после развертывания в Heroku - PullRequest
0 голосов
/ 31 января 2020

Я создал это приложение, используя стек MERN, и столкнулся с проблемами при развертывании в Heroku. У меня есть userContext.js файл, который обрабатывает аутентификацию пользователей. У него есть функция, которая отправляет запрос на сервер, который находится в разработке на localhost:80. Это работает нормально в разработке, и запрос выполнен успешно. После развертывания такой же запрос останавливается и завершается неудачей. Я не понимаю, как получить ответ на запрос. Любая помощь очень ценится. Спасибо, Hatim

сервер. js

const express = require("express"),
  http = require("http"),
  app = express(),
  server = http.createServer(app),
  bodyParser = require("body-parser"),
  mongoose = require("mongoose"),
  passport = require("passport"),
  cors = require("cors");

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cors());
app.use((req, res, next) => {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Methods", "DELETE, PUT, GET, POST");
  res.header(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content-Type, Accept"
  );
  next();
});
//IMPORT MODELS
require("./models/products");
require("./models/user");
//MONGOOSE CONNECT
mongoose.Promise = global.Promise;
mongoose
  .connect(
    process.env.MONGODB_URI || `mongodb://localhost:27017/technicalKwt`,
    {
      useNewUrlParser: true,
      useUnifiedTopology: true,
      useFindAndModify: false
    }
  )
  .then(() => console.log("MONGODB Connected"))
  .catch(err => {
    console.log(err);
  });
//SET FOR PRODUCTION
if (process.env.NODE_ENV === "production") {
  app.use(express.static("client/build"));

  const path = require("path");
  app.get("*", (req, res) => {
    res.sendFile(path.resolve(__dirname, "client", "build", "index.html"));
  });
}
// Passport middleware
app.use(passport.initialize());
// Passport config
require("./config/passport")(passport);

require("./api/products")(app);
require("./api/transaction")(app);
require("./api/users")(app);
require("./api/genPDF")(app);

const port = process.env.PORT || 80;

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

пользователей. js

app.post("/login", (req, res) => {
    console.log(req.body);
    const email = req.body.email;
    const password = req.body.password;
    User.findOne({ email }).then(user => {
      if (!user) {
        return res.status(401).json({ message: "Invalid Credentials" });
      }
      // Check password
      bcrypt.compare(password, user.password).then(isMatch => {
        if (isMatch) {
          // User matched
          // Create JWT Payload
          const payload = {
            id: user.id,
            name: user.name
          };
          // Sign token
          jwt.sign(
            payload,
            keys.secretOrKey,
            {
              expiresIn: 31556926 // 1 year in seconds
            },
            (err, token) => {
              res.json({
                success: true,
                token: "Bearer " + token,
                payload
              });
            }
          );
        } else {
          return res.status(401).json({ message: "Invalid Credentials" });
        }
      });
    });
  });

функция loginUser в userContext. js

function loginUser(dispatch, login, password, history, setIsLoading, setError) {
  setIsLoading(true);
  if (!!login && !!password) {
    axios
      .post('http://localhost:80/login', {
        email: login,
        password,
      })
      .then(res => {
        localStorage.setItem('id_token', res.data.payload.id);
        localStorage.setItem('name', res.data.payload.name);
        setIsLoading(false);
        dispatch({ type: 'LOGIN_SUCCESS' });
        history.push('/app/products');
      })
      .catch(err => {
        setIsLoading(false);
        dispatch({ type: 'LOGIN_FAILURE' });
      });
  } else {
    dispatch({ type: 'LOGIN_FAILURE' });
    setIsLoading(false);
  }
}

1 Ответ

0 голосов
/ 03 февраля 2020

Я делаю некоторые предположения о вашем приложении здесь.

В Heroku я считаю, что вы больше не можете использовать './'. На вашем сервере. js попробуйте использовать встроенное '__dirname':

require(__dirname + "/models/users")

Вторая проблема: ваш userContext. js предположительно находится на стороне клиента, так как это видит человек в их браузере. Путь к вашим маршрутам больше не является localhost: 80 это ваш домен heroku (some.com), поэтому вашему посту ios post необходимо новый URL. Попробуйте это:

axios
  .post('http://' + document.location.hostname + '/login', {
    email: login,
    password,
  })
...