承诺返回会得到500个内部服务器错误

时间:2018-08-16 02:45:57

标签: javascript php ajax ecmascript-6 promise

我制作了一个PHP函数,该函数在提交表单后回显JSON,我想与一个Promise请求进行交互。我不断收到500个内部服务器错误,我也不知道为什么。

这是我的文件-这是registerFail.js,应该在提交表单后获取JSON,以便我可以提醒消息,它位于主目录中:

window.onload = function(){

    function get(url) {
        return new Promise((resolve, reject) => {
          const xhr = new XMLHttpRequest();
          xhr.open("GET", url);
          xhr.onload = () => resolve(xhr.responseText);
          xhr.onerror = () => reject(xhr.statusText);
          xhr.send();
        });
      }

    document.getElementById('register').addEventListener('submit', () => {
            let promise = get('/controllers/add-user.php').then((name) => {
            console.log(name);
        });
    });
}

这是我的控制器php类,位于目录/controllers/add-user.php中,这是registerFail.js中的promise应该从中获取json的地方

header('Content-type: text/javascript');

$hash = password_hash($_POST['password'], PASSWORD_BCRYPT);

if(!$app['database']->nameTaken($_POST['username'])){

    $app['database']->insert('users', [

        'name' => $_POST['username'],

        'password' => $hash

    ]);
};

header('Location: /'); 

-> nameTaken函数是JSON的回显。

这是位于不同目录和文件中的nameTaken函数-

public function nameTaken($username){

        $statement = $this->pdo->prepare('SELECT count(*) FROM users WHERE name = :name');

        $statement->execute(array('name' => $username));

        $res = $statement->fetch(PDO::FETCH_NUM);

        $exists = array_pop($res);

        if ($exists > 0) {

            $json = array(
                'success' => false
            );

            echo json_encode($json);

            return true;

        } else {
            //the name can be made
            return false;
        }
    }

在我的服务器上,我收到以下消息:

[Thu Aug 16 12:16:18 2018] 127.0.0.1:44906 [200]: /
[Thu Aug 16 12:16:18 2018] 127.0.0.1:44910 [200]: /registerFail.js
[Thu Aug 16 12:16:22 2018] PHP Notice:  Undefined index: password in /home/orpheus/Practice_dev/imagePoster/controllers/add-user.php on line 5
[Thu Aug 16 12:16:22 2018] PHP Notice:  Undefined variable: app in /home/orpheus/Practice_dev/imagePoster/controllers/add-user.php on line 7
[Thu Aug 16 12:16:22 2018] PHP Fatal error:  Uncaught Error: Call to a member function nameTaken() on null in /home/orpheus/Practice_dev/imagePoster/controllers/add-user.php:7
Stack trace:
#0 {main}
  thrown in /home/orpheus/Practice_dev/imagePoster/controllers/add-user.php on line 7
[Thu Aug 16 12:16:22 2018] 127.0.0.1:44996 [500]: /controllers/add-user.php - Uncaught Error: Call to a member function nameTaken() on null in /home/orpheus/Practice_dev/imagePoster/controllers/add-user.php:7
Stack trace:
#0 {main}
  thrown in /home/orpheus/Practice_dev/imagePoster/controllers/add-user.php on line 7
 [Thu Aug 16 12:16:22 2018] 127.0.0.1:45000 [200]: /users

看来我的诺言正在执行,并试图在php文件加载之前获取json,所以没有json,并且我得到这些错误的未定义变量。我在加载/ users(/controllers/add-user.php)php json文件之前一瞬间看到了500错误,并在服务器中看到了上面所有的错误,但是当php文件从表单,它们都可以正常工作,并且我可以看到正确的json,但是当我重定向回“ /”主文件时,将清除控制台,而我的承诺也不会console.log json。

所以我认为我的问题是,单击我的提交按钮后,promise会立即执行,但是我需要在php json文件加载后执行,所以我不会在控制台中看到500服务器错误,并且上面显示的来自我的终端的服务器错误。

如何在加载php文件并将我重定向回“ /”页面后履行承诺?

1 个答案:

答案 0 :(得分:0)

我刚刚发现了烦恼,并使用了它们。这是我在add-user.php

中的代码
<?php

session_start();

$hash = password_hash($_POST['password'], PASSWORD_BCRYPT);

if(!$app['database']->nameTaken($_POST['username'])){

    $app['database']->insert('users', [

        'name' => $_POST['username'],

        'password' => $hash

    ]);
} else {
    $_SESSION['error'] = 'Username is taken';
}

header("location:/");

然后,我将会话设为表单形式的页面的控制器类中的变量

session_start();

$error = $_SESSION['error'];

,然后我在表单页面中创建了一个if语句,以显示$ error变量(如果已设置),然后取消设置会话并按照我的期望进行工作。