iT邦幫忙

1

laravel 的response應用發生的個案問題

先貼上程式碼

public static function backCall($data = '', $msg = '成功', $code = 200)
    {        
        $response = response()
        ->json(['code' => $code, 'msg' => $msg, 'data' => $data], $code)
        ->setEncodingOptions(JSON_UNESCAPED_UNICODE);        
        $response->send();
    }

上面這一段其實我是寫給api回應固定值用的。
在使用上沒啥問題。
主要是後面的send()。當初是網路上查到的資料。為了要讓程式再回應後就中斷之後的運行加上的。

也就是說,一但程式運行到這邊就會回應一個json值。不會再往下運行了。

但這幾天發生了一個個案問題。
其實程式開發一直都是5個人在共同運行開發。該段程式碼從一開始就存在。
原本使用上都一直相安無事。

但最近其中一個發生了不會中斷程式的問題
如以下的程式

<?php
   if($error){
       $msg = "無效的請求";
       sysRep::backCall([],$msg,500);
   }
   
   $data = [...]
   .(省略)
   sysRep::backCall($data);
?>

正常來說。如果error發生錯誤後。會回應一個錯誤的json並不在往下運行。
但其中一位工程師。他確發生了會往下運行不會中斷的情況。
然後拿到了兩段json。
這樣子當然會沒辦法做好回應。

由於另外4位並沒有發生這樣的情況。程式碼後來也用git同步了。
也只有他會發生這樣的問題。
且除了正式站是採用nginx的server運行之外。
開發人員都是在本機端使用 laravel 的內置server在開發。
唯一不同的是,其它4人都是windows的系統。有出問題的這位是用mac開發。

不過正常來講也不該有這樣的情況,畢竟在之前並不會發生這樣的事。
是最近才發生的。且使用的也是內置的server運行。

有請他試著api請求到正式站。是可以正常的。
目前只能推斷是他用的web server有問題。
可是因為使用的也只是單純 laravel 內置的server。也想不到是否有什麼設定發生了啥問題。
也思考不到是什麼問題會發生這樣的事。

想問看看這邊的大佬們,能否幫忙思考一下還有什麼可能性會發生這樣的事。
但因為是個案。我現在也無法自行測試。畢竟我這邊使用是正常的。

=============================

後續找到問題了。其實後來發現是在特定區段才會發生這樣的事。
查了一下。居然是我忘了加上return造成的。

而且我也誤會了send會中斷的事了。一切都是我自已搞錯了。其send並不會中斷的@@"

1 個回答

1
耿直小伙
iT邦新手 3 級 ‧ 2020-07-08 14:45:00
最佳解答

並不確定這是不是特例,但作為伺服器回應一慣使用return回應,下面這個例子沒有return只以send()的確可以取得重複json response

若使用send()與return將會重複輸出一樣的結果,所以使用return response()->json();可能比較沒問題

<?php

/** 
 * 第一種
 * 輸出{"code":200}{"code":404}
 * /
$response = response()
    ->json([
        'code' => 200
    ], 200)
    ->setEncodingOptions(JSON_UNESCAPED_UNICODE)
    ->send();

$response = response()
    ->json([
        'code' => 404
    ], 404)
    ->setEncodingOptions(JSON_UNESCAPED_UNICODE)
    ->send();

/**
 * 第二種
 * 輸出{"code":200}{"code":200}
 * /
$response = response()
    ->json([
        'code' => 200
    ], 200)
    ->setEncodingOptions(JSON_UNESCAPED_UNICODE)
    ->send();

return $response;

$response = response()
    ->json([
        'code' => 404
    ], 404)
    ->setEncodingOptions(JSON_UNESCAPED_UNICODE)
    ->send();

return $response;

/**
 * 第三種
 * 輸出{"code":200}
 * /
$response = response()
    ->json([
        'code' => 200
    ], 200)
    ->setEncodingOptions(JSON_UNESCAPED_UNICODE);

return $response;

$response = response()
    ->json([
        'code' => 404
    ], 404)
    ->setEncodingOptions(JSON_UNESCAPED_UNICODE)
    ->send();

return $response;

感謝,我後來找到原因了。
其實主因是。我有幾段沒加return

我要發表回答

立即登入回答