Ошибка 404 при попытке опубликовать в маршрут API - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь внедрить аутентификацию в свое приложение реагирования и получаю сообщение об ошибке 404 всякий раз, когда я пытаюсь POST к одному из моих express маршрутов API во время развертывания. Сервер, который я развертываю, является AWS EC2, если это имеет значение.

Вот мой Сервер. js файл:

const express = require('express');
const path = require('path');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const passport = require('passport');
const cors = require('cors');

const users = require('./routes/api/users');

const app = express();

app.use(cors());

// Bodyparser Middleware
app.use(
  bodyParser.urlencoded({
    extended: false
  })
);
app.use(bodyParser.json());

// DB Config
const db = require('./config/keys').mongoURI;

// Connect to MongoDB
mongoose
  .connect(
    db,
      { useNewUrlParser: true, useUnifiedTopology: true } 
  )
  .then(() => console.log("MongoDB successfully connected"))
  .catch(err => console.log(err));

// Passport middleware
app.use(passport.initialize());

// Passport config
require('./config/passport')(passport);

// Routes
app.use('/api/users', users)

// Serve static assets if in production
if (process.env.NODE_ENV === 'production') {

  // Set static folder
  app.use(express.static('client/build'));

  app.get('*', (req, res) => {
    res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
  });
}

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

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

Мой ./routes/api/ users. js file:

const express = require("express");
const router = express.Router();
const bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");
const keys = require("../../config/keys");

// Load input validation
const validateRegisterInput = require("../../validation/register");
const validateLoginInput = require("../../validation/login");

// Load User model
const User = require("../../models/User");

// @route POST api/users/register
// @desc Register user
// @access Public
router.post("/register", (req, res) => {
    // Form validation

  const { errors, isValid } = validateRegisterInput(req.body);

  // Check validation
    if (!isValid) {
      return res.status(400).json(errors);
    }

  User.findOne({ email: req.body.email }).then(user => {
      if (user) {
        return res.status(400).json({ email: "Email already exists" });
      } else {
        const newUser = new User({
          name: req.body.name,
          email: req.body.email,
          password: req.body.password
        });

  // Hash password before saving in database
        bcrypt.genSalt(10, (err, salt) => {
          bcrypt.hash(newUser.password, salt, (err, hash) => {
            if (err) throw err;
            newUser.password = hash;
            newUser
              .save()
              .then(user => res.json(user))
              .catch(err => console.log(err));
          });
        });
      }
    });
  });

  // @route POST api/users/login
// @desc Login user and return JWT token
// @access Public
router.post("/login", (req, res) => {
    // Form validation

  const { errors, isValid } = validateLoginInput(req.body);

  // Check validation
    if (!isValid) {
      return res.status(400).json(errors);
    }

    const email = req.body.email;
    const password = req.body.password;

  // Find user by email
    User.findOne({ email }).then(user => {
      // Check if user exists
      if (!user) {
        return res.status(404).json({ emailnotfound: "Email not found" });
      }

  // 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
              });
            }
          );
        } else {
          return res
            .status(400)
            .json({ passwordincorrect: "Password incorrect" });
        }
      });
    });
  });

  module.exports = router;

Вот пример одного из моих вызовов к express api:

// Register User
export const registerUser = (userData, history) => dispatch => {
  axios
    .post("http://localhost:5000/api/users/register", userData)
    .then(res => history.push("/login")) // re-direct to login on successful register
    .catch(err =>
      dispatch({
        type: GET_ERRORS,
        payload: err.response.data
      })
    );
};

Когда я отправляю свою форму при развертывании на мой сервер я получаю эту ошибку:

POST https://domainname.net/api/users/register 404 (не найден)

Я запускаю свой интерфейс на порту 3000 и мой сервер API на порту 5000. Весь мой код работает локально, и я понятия не имею, что происходит при развертывании на моем сервере ec2.

Ответы [ 2 ]

0 голосов
/ 11 января 2020

Попробуйте:

 export const registerUser = (userData, history) => dispatch => {
   axios
  .post("http://yourdomain:5000/api/users/register", userData)//change in url
  .then(res => history.push("/login")) // re-direct to login on successful 
  register
    .catch(err =>
    dispatch({
      type: GET_ERRORS,
      payload: err.response.data
   })
  );
};

После вашего домена вам нужно указать номер порта вашего сервера. Потому что по умолчанию POST https://domainname.net/api/users/register 404 (Not Found) примет номер порта как 80. Так что ничего там не будет.

0 голосов
/ 11 января 2020

в вашем приложении реагирования package.json файл добавьте ниже строки:

 "proxy": "http://localhost:5000",  // server port 

, и ваш URL для действия будет:

 axios.post("/api/users/register", userData)

, поэтому при запуске производственной сборки для приложения реагирования , он будет в папке client/build, и вы статически обслуживаете эту папку. клиент и сервер будут на одном и том же порту 5000

, поэтому /api/users/register будет отправлено на сервер с работающим портом 5000

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...