ErrorException: ファイル内に未定義の配列キー 'name' があります
P粉187677012
2023-08-31 10:33:00
<p>私は顧客の注文も追跡する顧客管理システムに取り組んでいます。バックエンド データベースからのデータの読み取りと書き込みを処理するために CRUD API を設定しましたが、ショッピング カート データをデータベースに POST しようとすると、次のエラーが発生します。 </p>
<ブロック引用>
<p>quote 応答からの JSON 解析エラー: SyntaxError: 予期しないトークン '<'、「 は有効な JSON ではありません</p>
<p>有効な JSON ではなく次のメッセージを受け取りました: <!-- ErrorException: 未定義の配列キー
ファイル内の「名前」
C:\Users\mjver\OneDrive\Documents\Coding\client-api\routes\api.php 上
238行目</p>
</blockquote>
<p>クライアントの $data["name"] 配列への入力データをチェックしましたが、エラーはありませんでした。誤字脱字などはチェックしましたが、新鮮な目でお役に立てれば幸いです。</p>
<p>フロントエンドとバックエンドのコード スニペットは次のとおりです。</p>
<p>api.js で API 呼び出し関数を呼び出します: </p>
<pre class="brush:php;toolbar:false;">async sendOrder(){
console.log(this.cart);
const order = await APIController.CreateOrder(this.cart.name, this.cart.qty, this.cart.option, this.cart.price, this.orderNum, this.cart.fee, this.cart.date, this. ID);
if(順序){
store.dispatch('clearCart');
}
},</pre>
<p>api.js ファイル内の API 呼び出し: </p>
<pre class="brush:php;toolbar:false;">CreateOrder: (名前、数量、オプション、価格、注文番号、料金、日付、ユーザー ID) => {
応答クローンを作成します。
const csrfToken = document.cookie.match(/XSRF-TOKEN=([^;] )/)[1];
もし(
名前 == "" ||
数量 == "" ||
オプション == "" ||
価格 == "" ||
注文番号 == "" ||
日付 == "" ||
ユーザー ID == ""
) {
false を返します。
} それ以外 {
return fetch(API_BASE "/orders/create", {
メソッド: "POST"、
ヘッダー: {
"Content-Type": "application/json"、
「X-CSRF-トークン」: csrfトークン
}、
body: JSON.stringify({ 名前, 数量, オプション, 価格, 注文番号, 料金, 日付, ユーザー ID })
}).then((応答) => {
応答Clone = 応答.clone();
応答.json() を返す
})
.then(データ => {
if(データ.成功){
alert("注文は正常に作成されました!")
true を返します。
} それ以外 {
data.response.error をスローします。
}
}, (拒否理由) => {
console.log('応答からの JSON 解析エラー: '、rejectionReason、responseClone);
応答Clone.text()
.then((bodyText) => {
console.log('有効な JSON の代わりに次のものを受信しています: ', bodyText);
});
}).catch(err => {
アラート(エラー);
});
}
}、</pre>
<p>api.php 文件中の php 路由:</p>
<pre class="brush:php;toolbar:false;">Route::post('/orders/create', function(Request $request){
$data = $request->all();
if(!Orders::where('orderNo', '=', $data['orderNo'])->exists()){
$order = 注文::create([
「名前」 => $data["名前"]、
「数量」 => $data["数量"],
「オプション」 => $data["オプション"]、
「注文番号」 => $data["注文番号"]、
「ユーザーID」 => $data["ユーザーID"]、
「価格」 => $data["価格"]、
「料金」 => $data["料金"]、
「日付」 => $data["日付"]、
]);
if(empty($order->id)){
戻る [
「成功」 =>間違い、
「応答」 => [
「エラー」 => 「異常なエラーが発生しました」
】
];
} それ以外 {
戻る [
「成功」 =>真実、
「応答」 => [
「注文」 => $order
】
];
}
} それ以外 {
戻る [
「成功」 =>間違い、
「応答」 => [
「エラー」 => 「在庫品目はすでに存在します」
】
];
}
});</pre>
<p>我的订单モデル文件:</p>
<pre class="brush:php;toolbar:false;">クラスの順序はモデルを拡張します
{
HasFactoryを使用します。
protected $fillable = [
'製品'、
「数量」、
'オプション'、
'注文番号'、
'ユーザーID'、
'価格'、
'手数料'、
'日付'、
];
公共機能積 (){
return $this->hasMany(Product::class);
}
}</pre>
</p>この問題を解決するのに役立つのであれば、私はあまり感情を起こさないでしょう。なぜなら、私はこれまでにある程度の苦しみを経験しているからです。
なんとか理解できました。 console.log(this.cart.name) を実行したところ、「未定義」であることがわかりました。さらに調査した結果、state.cart が 1 つのオブジェクトだけではなく、オブジェクトの配列であることが原因であることがわかりました。もちろん、その理由は、カート内の個々のアイテムがそれぞれ独自のオブジェクトである必要があるためです。したがって、私の解決策は次のとおりです:
リーリー内訳: this.cart はオブジェクトではなく配列であるため、まず for ループを使用してカート内の各アイテムのインデックスを取得し、次にデータをデータベースにポストする関数を呼び出す必要があります。