为什么我的发帖请求在浏览器上不起作用,而在Postman中起作用?

时间:2020-09-10 18:12:00

标签: javascript php reactjs laravel debugging

我的React.js项目和Laravel项目是分开的。

  1. 我使用此端点(http://127.0.0.1:8000/api/auth/login)在Postman中以经过身份验证的用户身份登录
  2. 然后我使用此(http://127.0.0.1:8000/api/auth/wall-of-fame
  3. 上传文件

一切正常-用户登录后,该登录用户可以将文件及其user_idemailfile_path成功上传到数据库。我在回复正文中的Postman中得到了inserted successfully

这项工作非常奇怪的是,我没有使用访问令牌将上述数据成功上传到Postman中的数据库。

但是,当我在浏览器上尝试上述两个步骤时-检查“网络”选项卡时出现200,但数据库中没有任何存储。我使用的是访问令牌,因为在客户端我还能如何识别经过身份验证的用户?我在浏览器的响应正文中得到failed

由于此过程在Postman中有效,所以我倾向于前端和我可能的Axios调用出现问题。我在做什么错了?

enter image description here

这里的Upload.js代码:

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

class Upload extends Component {
    constructor(props) {
        super(props);

        this.state = {
            selectedFile: null,
            id: null,
            email: ''
        };
        this.onFormSubmit = this.onFormSubmit.bind(this);
        this.onChange = this.onChange.bind(this);
        this.fileUpload = this.fileUpload.bind(this);
    }

    componentDidMount() {
        console.log("Inside componentDidMount()");
        let id = localStorage.getItem("id");
        let email = localStorage.getItem("email");
        this.setState({
            id: id,
            email: email
        })
        console.log(id);
        console.log(email);
    }

    onFormSubmit(e) {
        e.preventDefault();
        this.fileUpload(this.state.selectedFile);
    }

    onChange(e) {
        this.setState({ selectedFile: e.target.files }, () => this.state.selectedFile);
    }

    fileUpload(file) {
        const formData = new FormData();
        const accessToken = localStorage.getItem("access_token").slice(13,-8);

        console.log(accessToken);
        console.log(this.state.id);
        console.log(this.state.email);
        console.log(file.name);
        formData.append('file',file);

        const headers = {
            'Authorization' : 'Bearer ' + accessToken,
            'Content-Type': 'multipart/form-data'
        }

        axios.post('http://127.0.0.1:8000/api/auth/wall-of-fame', formData, {headers})
            .then(response => {
                console.log(response);
            }).catch(error => {
            console.log(error);
        });
    }

    render() {
        return (
            <form encType='multipart/form-data' id="login-form" className="form" onSubmit={this.onFormSubmit}>
                <input type="file" name="file" onChange={this.onChange}/>
                <button type="submit">Upload</button>
            </form>
        );
    }

}

export default Upload;

这里的FileUploadController.php代码:

<?php

namespace App\Http\Controllers;

use App\Photo;
use App\User;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;

class FileUploadController extends Controller {

    public function store(Request $request) {
        $user = Auth::user();

//        dd($user);

        if($user) {
            $user_id = Auth::user()->id;
            $email = Auth::user()->email;
            $filePath = $request->file('file')->getClientOriginalName();
            $data = [
                'file_path' => $filePath,
                'user_id' => $user_id,
                'email' => $email
            ];
            DB::table('db.photos')->insert($data);
            return "inserted successfully";
        }

    return "failed";

    }
}

这里的Auth.php登录方法:

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(),
        $user
    ]);
}

这是我的User.php文件(模型):

<?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use Notifiable, HasApiTokens;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password', 'user_id', 'file_path'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function photos() {
        return $this->hasMany(Photo::class);
    }
}

这是我的Photo.php文件(模型):

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Photo extends Model
{
    public function user() {
        return $this->belongsTo(User::class);
    }
}

这是api.php文件:

Route::middleware('auth:api')->group(function () {
Route::get('/user', function (Request $request) {
      return $request->user();
    });
});

Route::group([
    'prefix' => 'auth'
], function () {
    Route::post('login', 'AuthController@login');
    Route::post('signup', 'AuthController@signup');
    Route::post('wall-of-fame', 'FileUploadController@store');

    Route::group([
        'middleware' => 'auth:api'
    ], function() {
        Route::get('logout', 'AuthController@logout');
        Route::get('user', 'AuthController@user');
        Route::get('wall-of-fame', 'FileUploadController@fileUpload');
    });
});

0 个答案:

没有答案