ReactJS/Express Axios POST 返回 404,来自 Postman [英] ReactJS/Express Axios POST returns 404, works from Postman

查看:25
本文介绍了ReactJS/Express Axios POST 返回 404,来自 Postman的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不知道我在这里做错了什么.POST 方法适用于 Postman,但不适用于 React 前端.

I have no idea what I'm doing wrong here. The POST method works from Postman, but doesn't work from the React frontend.

users.js (/api/users/login)

users.js (/api/users/login)

// @route   POST api/users/login
// @desc    Login user / Returning JWT Token
// @access  Public
router.post('/login', (req, res, next) => {
  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 }) // matching email: email
    .then(user => {
      if (!user) {
        errors.email = 'User not found';
        return res.status(404).json(errors);
      }

    // Check Password
    bcrypt.compare(password, user.password)
      .then(isMatch => {
        if(isMatch) {

          // User matched. Create JWT payload
          const payload = {
            id: user.id
          } 

          // Sign Token
          jwt.sign(
            payload,
            keys.secretOrKey, 
            { expiresIn: 3600 }, 
            (err, token) => {
              res.json({
                success: true,
                token: 'Bearer ' + token
              });
          });
        } else {
          errors.password = 'Password incorrect'
          return res.status(400).json(errors);
        }
    });
  }); 
});

loginUser() 函数:

loginUser() function:

export const loginUser = userData => dispatch => {
  axios
    .post("/api/users/login", userData)
    .then(res => {
      // Save to localStorage
      const { token } = res.data;
      // Set token to localStorage
      localStorage.setItem("jwtToken", token); // only stores strings
      // Set token to Auth header
      setAuthToken(token);
      // Decode token to get user data
      const decoded = jwt_decode(token);
      // Set current user
      dispatch(setCurrentUser(decoded));
    })
    .catch(err =>
      dispatch({
        type: GET_ERRORS,
        payload: err.response.data
      })
    );
};

React 组件中的 onSubmit() 函数:

onSubmit() function in React component:

  onSubmit(e) {
    e.preventDefault();

    const userData = {
      email: this.state.email,
      password: this.state.password
    }

    this.props.loginUser(userData);
  }

网络:

Request URL: http://localhost:3000/api/users/login
Request Method: POST
Status Code: 404 Not Found
Remote Address: 127.0.0.1:3000
Referrer Policy: no-referrer-when-downgrade
Connection: keep-alive
Content-Length: 155
Content-Security-Policy: default-src 'self'
Content-Type: text/html; charset=utf-8
Date: Mon, 16 Jul 2018 01:53:03 GMT
Vary: Accept-Encoding
X-Content-Type-Options: nosniff
X-Powered-By: Express
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Connection: keep-alive
Content-Length: 46
Content-Type: application/json;charset=UTF-8
Cookie: io=VtWk-hb742jVakwrAAAE; PHPSESSID=ige5g7257th8hiksjomg2khouu; i18next=en; connect.sid=s%3Aq6FkEveJbDYoKTy386QESFBxGaW8MjKd.qSBAkm2t23Ww4ZtHtcs7%2F1e5tDn528i0C6Hv7U3PwI0
Host: localhost:3000
Origin: http://localhost:3000
Referer: http://localhost:3000/login
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
{email: "admin@gmail.com", password: "admin"}
email
:
"admin@gmail.com"
password
:
"admin"

server.js 上的端口:

The port on server.js:

// Initializint the port
const port = process.env.PORT || 5000;

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

我在这里检查了一些类似的问题,其中大部分与标题有关.就我而言,标题是 application/json,所以我认为问题不存在.通过 Postman 到达端点没有问题.

I checked some similar issues here, and most of them were related to headers. In my case, the headers are application/json, so I don't think the problem is there. No problems hitting the endpoint through Postman.

推荐答案

您的 React 应用程序在与后端应用程序不同的端口上运行.create-react-app 在端口 3000 上运行,正如您所说,您的后端在端口 5000 上运行.

Your react app is running on a different port than your backend app. create-react-app runs on port 3000 and as you've stated your backend is running on port 5000.

当您的客户端应用程序向服务器发出请求时,它实际上向端口 3000 发出请求,如您在此处所见.

When your client side app is making a request to the server, its actually making a request to port 3000 as you can see here.

请求地址:http://localhost:3000/api/users/login

这样做是因为您从未在请求​​中指定原始 url,正如您在此处看到的 post("/api/users/login", userData),在这种情况下,它默认为请求来自的相同端口是端口 3000,而端口 3000 实际上没有您请求的 url.

It's doing so because you never specified the origin url in your request as you can see here post("/api/users/login", userData), and in that case it defaults to the same port the request came from which is port 3000, and port 3000 does not in fact have the url you requested.

您可以通过在请求中包含原始 url 来解决此问题,也可以像在此处一样向 react app package.json 添加代理.

You can solve this by either including the origin url in the request, or by adding a proxy to the react app package.json as you can here.

https://github.com/facebook/create-react-app/blob/master/packages/react-scripts/template/README.md#proxying-api-requests-in-development

这篇关于ReactJS/Express Axios POST 返回 404,来自 Postman的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆