2017-08-28 66 views
0

我正在使用PHPAngular 4處理Web應用程序以處理應用程序上的CRUD操作。然而,當談到處理錯誤時,我認爲這不是做事情的最佳方式。如何正確返回並處理功能錯誤

這是我怎樣,我呼籲角的功能:

createUser(user: any): any { 
    return this._http.post(this.backendUrl, user).map(response => { 
     console.log('Success message: ', response); 
    }).catch(this.handleErrors); 
} 

handleErrors(error: Response): any { 
    console.log('Handle error: ', error); 
} 

比方說,例如,我想創建一個獨特的電子郵件的新用戶,所以我有這個PHP功能檢查如果已經註冊的電子郵件:

$param = [':email' => $email]; 
$check = sql("SELECT 1 FROM users WHERE email = :email", $param); 
if ($check) { 
    return print_r(array(
     'success' => 0, 
     'message' => 'This email is already registered' 
    )); 
} 

// [...Finish the user registration...] 

return print_r(array(
    'success' => 1, 
    'message' => 'Account successfully created!' 
)); 

這樣,當函數返回時,我會檢查success值是10和使用顯示消息例如,。但我不認爲這是做到這一點的最佳/正確的方式。

我試圖使用PHP的異常,像這樣:

$param = [':email' => $email]; 
$check = sql("SELECT 1 FROM users WHERE email = :email", $param); 
if ($check) { 
    throw new Exception('This email is already registered'); 
} 

但這並不解決問題。會發生的是,如果我在控制檯的網絡選項卡下檢查該功能,該功能將引發錯誤,並且該功能將觸發成功返回但具有空響應。我看到在此的console.log消息:

成功消息:空


什麼是處理這種情況的最好方法是什麼?我想在哪裏檢查函數是否要完成所有小塊,並且只有在它確實正確地執行了所有操作時才返回成功。

+0

我假設你'sql'函數返回的結果而不是一個布爾。另一件事是'print_r'返回一個布爾值,你需要像'print_r('foo',true)'最後一個字符串輸出的第二個參數,爲什麼不返回json呢?最後:你甚至會顯示一些文字嗎?你應該在新標籤中打開它。我現在不知道如何在PHP中獲取數據,但如果使用'$ _REQUEST'獲取數據,則可以使用get參數來測試輸出 – Soundz

+0

我不知道PHP如何處理異常,但是返回的值爲null '很奇怪。你需要等多久?它可能是超時? –

+0

@Soundz關於sql函數的返回,它可以是Object,array或false,具體取決於查詢。當我使用print_r方法時,沒有問題,一切都按預期工作,但我總是需要檢查成功返回是否實際上是成功或在函數內出錯。我想知道在這種情況下是否有一種方法可以使用選項來引發錯誤,當函數中的某些內容阻止它繼續時。 – celsomtrindade

回答

1

RXJS-Catch將在HTTP代碼上觸發,表示出現錯誤。通常,建議發送有用的代碼,如400(錯誤請求)。

要發送這樣的錯誤,加上下面一行到你的PHP錯誤情況:

http_response_code(400); 

現在看起來應該是這樣:

if ($check) { 
    http_response_code(400); 
    return print_r(array(
     'success' => 0, 
     'message' => 'This email is already registered' 
    )); 
} 
+1

我花了一些時間,因爲我必須更改Angular代碼上的一些配置才能使其工作。但它按照我的意圖行事。謝謝! – celsomtrindade