Javascript 如何正确返回和处理函数错误

Javascript 如何正确返回和处理函数错误,javascript,php,angular,Javascript,Php,Angular,我正在使用PHP和Angular 4开发一个WebApp来处理应用程序上的CRUD操作。然而,当谈到处理错误时,我觉得这不是最好的方法 这就是我在角度上调用函数的方式: createUser(user: any): any { return this._http.post(this.backendUrl, user).map(response => { console.log('Success message: ', response); }).catch(

我正在使用PHP和Angular 4开发一个WebApp来处理应用程序上的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值是1还是0,并使用警报显示消息。但我认为这不是最好/正确的方法

我尝试使用PHP异常,如下所示:

$param = [':email' => $email];
$check = sql("SELECT 1 FROM users WHERE email = :email", $param);
if ( $check ) {
    throw new Exception('This email is already registered');
}
if ( $check ) {
    http_response_code(400);
    return print_r(array(
        'success' => 0,
        'message' => 'This email is already registered'
    ));
}
但这并不能解决问题。如果我在控制台上的网络选项卡下检查函数,它将抛出一个错误,该函数将触发成功返回,但响应为空。我在console.log上看到以下消息:

成功消息:空


处理这种情况的最佳方法是什么?我想检查函数是否将完成所有的小部分,并且只有当它真正正确地完成所有操作时才返回成功。

RXJS Catch将在HTTP代码上触发,指示错误。通常,建议发送有用的代码,如400 Bad Request

要发送此类错误,请在PHP错误案例中添加以下行:

http_response_code(400);
现在应该是这样的:

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

我假设您的sql函数返回结果,而不是bool。另一件事是print_r返回bool,您需要第二个参数作为字符串输出,比如print_r'foo',最后,为什么不返回json呢?最后:你有没有显示一些文字?您应该在新选项卡中打开它。我现在不知道如何在PHP中提取数据,但是如果使用$\u请求提取数据,您可以使用get参数来测试输出。我不知道PHP如何处理异常,但是使用值为null的响应很奇怪。你要等多久?可能是超时吗?@Soundz关于sql函数的返回,它可以是对象、数组或false,具体取决于查询。当我使用print_r方法时,没有问题,一切正常,但我始终需要检查成功返回是否确实成功,或者函数中是否存在错误。我想知道,在这种情况下,当函数中的某些内容阻止它继续时,是否有方法使用option抛出错误。@MarkusKollers超时有问题,在本地主机上,它将在20-40分钟内返回。请尝试我的答案:-这花了我一些时间,因为我必须更改Angular代码的一些配置才能使其正常工作。但它像我说的那样起作用。谢谢