2016-12-14 40 views
0

当我跑我的JavaScript我得到这个错误:遗漏的类型错误的JavaScript Canot读取属性“”用户名”

KinveyRequester.js:23 Uncaught TypeError: Cannot read property 'username' of undefined

而且我不知道怎么解决它

代码:

function registerUser(e) { 
    registerAjax(e); 
    registerSuccess(); 
    // window.location = "Items.html"; 
} 

function registerSuccess(userInfo) { 
    saveAuthInSession(userInfo); 
    showInfo('User registration successful.'); 
} 

function saveAuthInSession(userInfo) { 
    sessionStorage.setItem("username", userInfo.username); 
    sessionStorage.setItem("authToken", userInfo._kmd.authtoken); 

    $("#loggedInUser").text("Welcome, " + userInfo.username); 
} 

function registerAjax(e) { 
    e.preventDefault(); 

    let userData = { 
     username: $("#username").val(), 
     password: $("#password").val() 
    }; 

    $.ajax({ 
     method: "POST", 
     url: kinveyBaseUrl + "user/" + kinveyAppKey + "/", 
     headers: kinveyAppAuthHeaders, 
     data: userData, 
     success: registerSuccess, 
     error: handleAjaxError 
    }); 
} 
+1

考虑把你的代码放到一个掉毛的工具。你有一些语法错误。 – evolutionxbox

+0

似乎你从来没有在这里调用'saveAuthSession'? –

+0

它应该是userData,而不是userInfo。 – pshep123

回答

0

的reeasons此错误是userInfo未定义所以JavaScript是无法找到的userInfo因为userInfo是属性“用户名” 请告诉你什么时候调用这个函数saveAuthInSession?

function registerAjax(e) { 
    e.preventDefault(); 

    var userData = { 
     username: $("#username").val(), 
     password: $("#password").val() 
    }; 

    $.ajax({ 
     method: "POST", 
     url: kinveyBaseUrl + "user/" + kinveyAppKey + "/", 
     headers: kinveyAppAuthHeaders, 
     data: userData, 
     success: function() { 
      registerSuccess(userData); 
     }, 
     error: handleAjaxError 
    }); 
} 

调用该函数这里

+0

Here: function registerSuccess(userInfo){ saveAuthInSession(userInfo); showInfo('用户注册成功。'); } –

+0

你什么时候调用registerSuccess? –

+0

这里 函数registerUser(e){ registerAjax(e); registerSuccess(); //window.location =“Items.html”; } –

1

你不叫registerSuccess与用户数据(或任何PARAM),因此“用户信息”参数将始终是不确定的。

你可以做两个修改

  • 从registerUser删除,因为这将运行前阿贾克斯完成了成功

  • 通用户数据:

    success: function() { 
        registerSuccess(userData); 
    }); 
    

    我不要使用let,因为它不是向后兼容的,但这会c如果您将其更改为 'VAR用户数据'

    更新代码ertainly工作:

    function registerUser(e) { 
        registerAjax(e); 
        // do not call here - this will run before the ajax has completed: registerSuccess(); 
        // window.location = "Items.html"; 
    } 
    
    function registerSuccess(userInfo) { 
        saveAuthInSession(userInfo); 
        showInfo('User registration successful.'); 
    } 
    
    function saveAuthInSession(userInfo) { 
        sessionStorage.setItem("username", userInfo.username); 
        sessionStorage.setItem("authToken", userInfo._kmd.authtoken); 
    
        $("#loggedInUser").text("Welcome, " + userInfo.username); 
    } 
    
    function registerAjax(e) { 
        e.preventDefault(); 
    
        var userData = { 
         username: $("#username").val(), 
         password: $("#password").val() 
        }; 
    
        $.ajax({ 
         method: "POST", 
         url: kinveyBaseUrl + "user/" + kinveyAppKey + "/", 
         headers: kinveyAppAuthHeaders, 
         data: userData, 
         success: function() { 
          // this will keep the scope of userData above and pass on success 
          registerSuccess(userData); 
         }, 
         error: handleAjaxError 
        }); 
    } 
    

    当然,你会立即得到了下一个问题:

    userInfo._kmd.authtoken 
    

    为_kmd。 authtoken不是用户数据的一部分

    所以这一切都取决于你从POST得到什么,即

    success: function(responseData) { 
        console.log(responseData); 
        registerSuccess(responseData); 
    } 
    
  • +0

    @Endless请参照最后的更新,已经注意到了。目前尚不清楚这是否会成为问题。 –

    +0

    现在,它的工作,感谢bro –

    0

    只是想知道,如果它会更容易为你只是减少您呼叫功能的数量...

    function registerUser(e) { 
        e.preventDefault(); 
    
        var userData = { 
         username: $('#username').val(), 
         password: $('#password').val() 
        }; 
    
        $.ajax({ 
         method: 'POST', 
         url: kinveyBaseUrl + 'user/' + kinveyAppKey + '/', 
         headers: kinveyAppAuthHeaders, 
         data: userData, 
         success: function(responseData) { 
          showInfo('User registration successful.'); 
          sessionStorage.setItem('username', userInfo.username); 
          sessionStorage.setItem('authToken', userInfo._kmd.authtoken); 
          // sessionStorage.setItem('authToken', responseData._kmd.authtoken); ? 
          // window.location = "Items.html"; 
          $('#loggedInUser').text('Welcome, ' + userInfo.username); 
         }, 
         error: handleAjaxError 
        }); 
    } 
    
    +0

    'userInfo'定义在哪里?应该是'userData'还是'responseData'? –

    相关问题