无法阅读财产' getPayload'未定义的

时间:2017-11-16 21:07:40

标签: node.js heroku google-oauth

我正在使用后端实现OAuth Google登录(使用heroku编写的node.js,express框架)。前端是Android,它将令牌ID发送到服务器就好了。服务器正确接收令牌ID。

以下是代码(直接从Google文档中删除)

var auth = new GoogleAuth;
var client = new auth.OAuth2(CLIENT_ID, '', '');
    client.verifyIdToken(
        token,
        CLIENT_ID,
        // Or, if multiple clients access the backend:
        //[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3],
        function(e, login) {
            var payload = login.getPayload();
            var userid = payload['sub'];
            // If request specified a G Suite domain:
            //var domain = payload['hd'];

        });

但有时登录未定义。它很奇怪,这个问题发生在1/10而不是每次尝试,所以我无法追踪问题的根源。对于其他每一个9/10,它的工作正常。

有关如何解决此问题的任何建议?

2 个答案:

答案 0 :(得分:2)

您的代码中的问题是您没有检查您的回调是否有任何错误。

node.js中使用回调函数的标准方法是使用两个参数 - 错误是第一个,实际(成功)返回的数据是第二个,并且约定是如果存在错误 - 你应该解决它,并且您没有获得数据的保证,如果一切顺利,错误将为空,您将获得数据。

因此,在您的代码中,您没有检查是否存在错误(就像您说的那样,并非总是存在错误。)
应该是这样的:

function(e, login) {
  if (e) {
     // handle error here
    return; // don't continue, you don't have login 
  }
  // if we got here, login is defined
  var payload = login.getPayload();
  var userid = payload['sub'];
  // If request specified a G Suite domain:
  //var domain = payload['hd'];
});

答案 1 :(得分:1)

回调函数的第一个参数是需要处理的错误。

    function(error, login) {
        if (error) return console.error(error)
        var payload = login.getPayload();
        var userid = payload['sub'];
        // If request specified a G Suite domain:
        //var domain = payload['hd'];

    });