【问题标题】:How can I solve this 422 error when trying to send information to the database using an axios POST request?尝试使用 axios POST 请求将信息发送到数据库时,如何解决此 422 错误?
【发布时间】:2020-04-19 00:33:16
【问题描述】:

我遇到了一个有趣的错误(POST http://127.0.0.1:8000/api/auth/signup 422 (Unprocessable Entity) 使用 axios 发出 POST 请求以将用户信息存储到我的数据库中。

我已经使用 Laravel(PHP 框架)创建了一个端点,并通过 Postman 使用正确的标头进行了测试,并且工作正常,但由于某种原因,它的前端部分让我很难过,不知道该怎么做。一堵墙。我究竟做错了什么?如何成功将用户信息存储到数据库中?

import React, {Component} from 'react';
import axios from "axios";

class Register extends Component {
    constructor(props) {
        super(props);
        this.state = {
            username: "",
            email: "",
            password: ""
        };
        this.userNameHandler = this.userNameHandler.bind(this);
        this.emailHandler = this.emailHandler.bind(this);
        this.passwordHandler = this.passwordHandler.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
    }

    userNameHandler(e) {
        this.setState({
            username: e.target.value,
        });

        console.log(this.state.username);
    }

    emailHandler(e) {
        this.setState({
            username: e.target.value,
        });

        console.log(this.state.email);
    }

    passwordHandler(e) {
        this.setState({
            username: e.target.value,
        });

        console.log(this.state.password);
    }

    handleSubmit(e) {
        e.preventDefault();
        const user = {
            name: this.state.name,
            email: this.state.email,
            password: this.state.password
        }

        JSON.stringify(user);

        const headers = {
            'Content-Type': 'application/json',
            'X-Requested-With': 'XMLHttpRequest'
        }

        this.setState({
            username: e.target.value
        });

        axios.post('http://127.0.0.1:8000/api/auth/signup', user, headers)
            .then(response => {
                console.log(response);
                console.log(response.data);
            }).catch(error => {
                console.log("AXIOS ERROR!! " + error);
        });
    }

    render() {
        return (
            <div className="container">
                <div id="login-row" className="row justify-content-center align-items-center">
                    <div id="login-column" className="col-md-6">
                        <div id="login-box" className="col-md-12">
                            <form id="login-form" className="form" method="post" onSubmit={this.handleSubmit}>
                                <div className="form-group">
                                    <label htmlFor="username" className="text-info">Username:</label><br/>
                                    <input type="text" name="username" id="username" className="form-control" onChange={this.userNameHandler}/>
                                </div>
                                <div className="form-group">
                                    <label htmlFor="username" className="text-info">Email:</label><br/>
                                    <input type="text" name="username" id="username" className="form-control" onChange={this.emailHandler}/>
                                </div>
                                <div className="form-group">
                                    <label htmlFor="password" className="text-info">Password:</label><br/>
                                    <input type="text" name="password" id="password" className="form-control" onChange={this.passwordHandler}/>
                                </div>
                                <div className="form-group">
                                    <input type="submit" name="submit" className="btn btn-info btn-md"
                                           value="Submit"/>
                                </div>
                            </form>
                        </div>
                    </div>
                </div>
            </div>
        );
    }
}

export default Register;

这是我的控制器:

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
use App\User;

class AuthController extends Controller
{
    /**
     * Create user
     *
     * @param  [string] name
     * @param  [string] email
     * @param  [string] password
     * @param  [string] password_confirmation
     * @return [string] message
     */
    public function signup(Request $request)
    {
        $request->validate([
            'name' => 'required|string',
            'email' => 'required|string|email|unique:users',
            'password' => 'required|string|confirmed'
        ]);
        $user = new User([
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password)
        ]);
        $user->save();
        return response()->json([
            'message' => 'Successfully created user!'
        ], 201);
    }

    /**
     * Login user and create token
     *
     * @param  [string] email
     * @param  [string] password
     * @param  [boolean] remember_me
     * @return [string] access_token
     * @return [string] token_type
     * @return [string] expires_at
     */
    public function login(Request $request)
    {
        $request->validate([
            'email' => 'required|string|email',
            'password' => 'required|string',
            'remember_me' => 'boolean'
        ]);
        $credentials = request(['email', 'password']);
        if(!Auth::attempt($credentials))
            return response()->json([
                'message' => 'Unauthorized'
            ], 401);
        $user = $request->user();
        $tokenResult = $user->createToken('Personal Access Token');
        $token = $tokenResult->token;
        if ($request->remember_me)
            $token->expires_at = Carbon::now()->addWeeks(1);
        $token->save();
        return response()->json([
            'access_token' => $tokenResult->accessToken,
            'token_type' => 'Bearer',
            'expires_at' => Carbon::parse(
                $tokenResult->token->expires_at
            )->toDateTimeString()
        ]);
    }

    /**
     * Logout user (Revoke the token)
     *
     * @return [string] message
     */
    public function logout(Request $request)
    {
        $request->user()->token()->revoke();
        return response()->json([
            'message' => 'Successfully logged out'
        ]);
    }

    /**
     * Get the authenticated User
     *
     * @return [json] user object
     */
    public function user(Request $request)
    {
        return response()->json($request->user());
    }
}

【问题讨论】:

    标签: javascript reactjs debugging post axios


    【解决方案1】:

    您的表单中没有电子邮件字段,您有两个用户名字段

    在这段代码中

    <div className="form-group">
                                        <label htmlFor="username" className="text-info">Username:</label><br/>
                                        <input type="text" name="username" id="username" className="form-control" onChange={this.userNameHandler}/>
                                    </div>
                                    <div className="form-group">
                                        <label htmlFor="username" className="text-info">Email:</label><br/>
                                        <input type="text" name="username" id="username" className="form-control" onChange={this.emailHandler}/>
                                    </div>
    

    【讨论】:

    • 好收获!我试着改变它,但我仍然得到同样的错误:(。
    • 在表单中添加 csrf 令牌字段,我认为这将修复错误
    • 嗯,在这种情况下我该怎么做?
    • 代码422的错误往往是验证错误,请验证控制器中验证属性对应的字段名称是否。
    • 在我原来的帖子中发布了我的控制器,我仍然看不到有什么问题:(
    猜你喜欢
    • 1970-01-01
    • 2021-06-05
    • 2021-07-24
    • 2021-01-17
    • 2021-10-02
    • 2020-08-04
    • 1970-01-01
    • 2020-06-05
    相关资源
    最近更新 更多