为什么auth0的parseHash返回未定义?

时间:2019-02-23 17:11:30

标签: reactjs auth0 reach-router

当我尝试尝试auth0的auth0时,我是parseHash的新手。令我惊讶的是,该函数以某种方式返回null。我试图窥视source code内部,看来此函数最终尝试返回某些内容。

这是令我困惑的代码部分:

import React from 'react';
import { Link } from '@reach/router';
import './Callback.sass';

export const Callback = ({ auth, navigate }) => {
  let result = auth.parseHash((err, authResult) => {
    if (err) {
      return (
        <div className="error">
          <h1>{err.error}</h1>
          <p>{err.errorDescription}</p>
          <Link to="/">Home</Link>
        </div>
      );
    } else {
      console.log({ authResult });
      return 'profile';
      // localStorage.setItem('authResult', JSON.stringify(authResult));
      // navigate('/profile');
    }
  });
  console.log({ result });
  if (result) return result;
  return <React.Fragment />;
};

结果如下: enter image description here

我认为这确实令人困惑。控制台记录了“ authResult”部分,但是resultundefined。 (我什至对异步等待进行了测试,仍然无法达到我的期望。)

我目前只是将结果包装起来以解决此问题。

这是一个错误吗?还是我使用的方法不正确?

3 个答案:

答案 0 :(得分:1)

我也是auth0的新手,今天也遇到了相同的错误。

通过将parseHash包装在Promise中来解决此问题:

/* ... */

function handleAuthentication() {
  // wrap parseHash in a Promise
  return new Promise((resolve, reject) => {
    auth0.parseHash((err, authResult) => {
      if (authResult && authResult.accessToken && authResult.idToken) {
        resolve(authResult)
      } else if (err) {
        throw new Error(`Error: ${err.error}. Check the console for further details.`);
      } else {
        throw new Error(`Unknown error`);
      }
    })
  })
}

// wait for the Promise to resolve and log the result
handleAuthentication()
  .then(function(result) {
    console.log(result);
  });

您的代码中的问题是,您希望parseHash直接返回结果,但不会返回结果(第22行)。而是调用回调函数,该回调函数您已正确注册,因此可以在回调函数内而不是在回调函数外获得预期的结果。

答案 1 :(得分:1)

您的console.log({ result });

之前运行

let result = auth.parseHash((err, authResult) => {

因此将其包装在Promise中可以提供帮助。

答案 2 :(得分:0)

代码没有错...实际上,在当前示例中,您应该始终安慰auth.parseHash$(),而实际上并没有得到什么,实际上,Observable<any>是一个返回auth.parseHash$()的回调。

其目的是解析url哈希并提取Auth响应,返回您传入的一些自定义参数(精确来说是哈希段)。

因此,如果您不希望返回在请求授权时传递的一些哈希参数,df = pandas.DataFrame({"data": [1, 2, 3], "type": ["good - multiple", "bad - multiple", "good - single"]}) #this will fail as df.type doesn't have a startswith method good_df = df[df.type.startswith("good")] 将不返回任何内容-链接here