我在使用 axios post 时遇到问题

I'm having trouble using axios post in react

当我使用 axios 时 post 错误不断出现。我还安装了cors。我不知道为什么会这样。这是我的反应代码。

import React, { useState } from 'react'
import { Link } from 'react-router-dom'

import axios from 'axios'

export default function Login() {

const [Email, SetEmail] = useState('')
const [Password, SetPassword] = useState('')


return (
    <div>

            <h1>Login</h1>
            <input type="text" placeholder="Email" value={Email} onChange={(e) => SetEmail(e.target.value)} />
            <input type="password" placeholder="Password" value={Password} onChange={(e) => SetPassword(e.target.value)} />
            <button type="submit" onClick={(e) => {
                                const config = {
                                    headers: {
                
                                        'Content-Type': 'application/json'
                                    }
                                }
                                const body = JSON.stringify({ Email, Password })
                                axios.post('http://localhost:4000/app/signin', body, config)
                                    .then((response) => console.log(response.data))
            }}>Login</button>
            <div style={{ float: "right", marginTop: "10px" }}>
                <Link to="/signup" style={{ color: "white" }}>
                    SIGN UP
                    </Link>
            </div>

    </div>
)
}

我正在练习登录。我没有使用表单标签。因为当我向后端提交数据时,控制台已初始化并且看不到发生了什么。接下来是我的 node.js 代码。

router.post(
'/signin',
[
    check('email', 'Type proper e-mail').isEmail(),
    check('password', 'Password is required').not().isEmpty()
],
async (request, response) => {
    try{



        const {email, password} = request.body;
        let user = await signUpTemplateCopy.findOne({email});
        const errors = validationResult(request);

        if (!errors.isEmpty()) {
            return response.status(401).json({errors: errors.array()});
        }

        if (!user){
            return response.status(401).json({ msg: "There is no user with this e-mail"});

        }

        let isPasswordMatch = await bcryptjs.compare(password, user.password);

        if (isPasswordMatch) {

        const payload = {
            user: {
                id : user.id
            }
        }
        jwt.sign(
            payload,
            config.get('jwtSecret'),
            (err, token) => {
                if (err) throw err;
                response.json({token});


            }
        )
        
        } else return response.status(401).json({msg: "wrong password"});
        

    } catch (error) {
        console.log(error.msg);
        return response.status(500).json({msg: "Server Error..."});
    }
})

我什至猜不出是什么问题。请帮我解决这个问题。

为了验证电子邮件和密码,我推荐 express-validator 库。你会像这样实现它:

router.post(
  "/signin",
  [
    body("email").isEmail().withMessage("Email must be valid"),
    body("password")
      .trim()
      .notEmpty()
      .withMessage("You must supply a password"),
  ]

您可能需要错误处理中间件。对于你的 User 模型,signupTemplateCopy 似乎是一个令人困惑的命名约定,但你会取而代之,运行 if 条件如下:

async (req, res) => {
    const { email, password } = req.body;

    const existingUser = await User.findOne({ email });

    if (!existingUser) {
      throw new BadRequestError("Invalid Credentials");
    }

我使用一个鲜为人知的 npm 库 BadRequestError() 你在上面看到的叫做 @dc_microurb/common@^1.0.7。此外,除了 bcrypt,您可能还想从 crypto 库中尝试 scrypt,但您所拥有的会起作用。

我也不确定您是如何生成 JWT 的。假设您按照我的建议使用 const existingUser = await User.findOne({ email }); 或在您的情况下 const existingUser = await signUpTemplateCopy.findOne({ email });,那么您将采用 existingUser 或在您的情况下 user 来生成 JWT像这样:

const userJwt = jwt.sign(
      {
        id: existingUser.id,
        email: existingUser.email,
      },
      process.env.JWT_KEY!
    );

然后您需要将该 JWT 存储在我在您的代码中任何地方都看不到的会话对象中,如下所示:

req.session = {
      jwt: userJwt,
    };

然后你终于可以发回 res.status(200).send(user); 或者在我的例子中 res.status(200).send(existingUser);