【问题标题】:Axios post request failure from React front end to Laravel and mysqlAxios 从 React 前端向 Laravel 和 mysql 发布请求失败
【发布时间】:2020-05-05 20:35:37
【问题描述】:

我最近开始学习 Laravel 和所有后端 Php 结构。我正在尝试从我用 React 制作的表单发出一个简单的发布请求,我希望它存储到我的 sql 数据库中。我已经创建了模型,将表迁移到 Db 中。只有一个字段,并且是插入到输入文本中的名称。 到目前为止,这是我的代码: 反应形式:

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

export default class App extends Component {
  constructor(props) {
    super(props);
    this.state= {
      name: ""
    }

    this.onSubmit= this.onSubmit.bind(this);
    this.onChange=this.onChange.bind(this);
  }

  onChange = e =>{
    this.setState({
      name: e.target.value
    })
  }
  onSubmit(e){
    e.preventDefault();
    const {name} = this.state;

    let data = {
      name: name
    };






        axios.post('/', data)
            .then(response => {
               console.log(data);

            })
            .catch(err => {
               console.log(err);

            })

};

  render() {
    return (
      <>
        <div>
          <form onSubmit={this.onSubmit}>
            <label>name</label>
         <input type="text"  onChange={this.onChange}></input>
         <button type="submit">submit</button> 
          </form>

    <h1>{this.state.name}</h1>

        </div>

      </>
    );
  }
}

路线:

<?php

use Illuminate\Support\Facades\Route;

// The frontend is an SPA, so point all URIs (except /api/*) to the AppController.
Route::get('{uri?}', 'AppController@app')->where(['uri' => '^(?!api).*$'])->name('app');






Route::post('/', 'StoreDataCOntroller@store');


?>

我的控制器:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Form;

class StoreDataCOntroller extends Controller
{
    public function store(){
        $data = new Form();

        $data->name = request('name');


        $data->save();
    }
}

模型(空):

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Form extends Model
{
    //
}

和迁移:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateFormsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('forms', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string("name");
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('forms');
    }
}

我的环境文件:

APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:ZJmPVhi6byB/kzZt/IEyEBFYK3QUVc6b+65ITHDo/pM=
APP_DEBUG=true
APP_URL=http://localhost:8080

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=test
DB_PASSWORD=ciaoss

现在,当我在反应输入中按提交时,我将遇到一般错误“内部服务器错误 500”。 我在哪里做错了? 谢谢你的帮助:)

编辑: 错误日志信息

[previous exception] [object] (PDOException(code: 42S22): SQLSTATE[42S22]: Column not found: 1054 Unknown column 'updated_at' in 'field list' at C:\\xampp\\htdocs\\dev-test\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Connection.php:453)

【问题讨论】:

标签: php mysql reactjs laravel axios


【解决方案1】:

问题在于,默认情况下,Laravel 期望通过迁移创建时间戳(created_at 和 updated_at)字段。这让你有两个选择

  1. 告诉模型没有时间戳

    class Form extends Model
    {
        public $timestamps = false;
    }
    
  2. 添加到您的迁移时间戳

class CreateFormsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('forms', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string("name");
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('forms');
    }
}

另外,在控制器中,函数应该返回一些响应。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Form;

class StoreDataCOntroller extends Controller
{
    public function store(){
        $data = new Form();

        $data->name = request('name');


        $data->save();
        return response()->created();
    }
}

【讨论】:

  • 我试过了,但我仍然得到错误。以下是他们在 console.log 中所说的内容:``` 错误:在 XMLHttpRequest.handleLoad (xhr.js:61 )```
  • 需要查看PHP级别的日志。通常它位于 storage/logs/laravel.log 打开该文件并在底部查看显示的错误。
  • #40 C:\\Users\\leont\\Desktop\\dev-test-master\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline。 php(105): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #41 C:\\Users\\leont\\Desktop\\ dev-test-master\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(151): Illuminate\\Pipeline\\Pipeline->then(Object(Closure) ) #42 C:\\Users\\leont\\Desktop\\dev-test-master\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(1
  • 那里肯定有一些东西,但不幸的是完整的错误消息被裁剪掉了。看看你是否能得到完整的错误信息,或者只是使用 pastebin 之类的东西来共享文件内容
  • 非常感谢您的帮助:pastebin.com/GRH9dYc8
【解决方案2】:

正如您在 Laravel.log 中看到的,您遇到错误:找不到列:1054 Unknown column 'updated_at' in 'field list'

在你的表单模型中你需要设置

public $timestamps = false;

【讨论】:

  • 但是我没有在迁移中设置任何带有时间戳的字段。我只有名称字段。我从一个领域开始,只是为了测试
  • Laravel 假设每个表都有时间戳,即使它们不在您的迁移中。所以你仍然需要通过上面的代码在你的模型中关闭它们。
  • 非常感谢,我已经在迁移中添加了,现在它可以工作了。再次感谢:)
猜你喜欢
  • 1970-01-01
  • 2019-02-25
  • 2017-09-26
  • 1970-01-01
  • 2021-03-10
  • 2021-05-18
  • 1970-01-01
  • 2018-08-03
  • 2019-09-27
相关资源
最近更新 更多