Próbuję wdrożyć login zmechanizuj i nie jest w stanie zwrócić wartości z funkcji wywołania zwrotnego. Używam tego pakietu NPM: Auth0-JS. W mojej konfiguracji jest dwa pliki. Pierwszy to authservice.js, gdzie mam logikę loginową:

import auth0 from "auth0-js";

function initializeAuth0Client(domain, redirectUri, clientID) {
  return new auth0.WebAuth({
    domain: "{YOUR_AUTH0_DOMAIN}",
    clientID: "{YOUR_AUTH0_CLIENT_ID}",
  });
}

function handleLogin(client, user) {
  return client.login(
    {
      realm,
      username,
      password,
    },
    (err, authResult) => {
      if (authResult) {
        return authResult;
      }
    }
  );
}

module.exports = {
  handleLogin,
  initializeAuth0Client,
};

Drugi: index.js

import { handleLogin, initializeAuth0Client } from "authService";


const auth0Client = initializeAuth0Client(domain, redirectUri, clientID);
const authResponse = handleLogin(auth0Client, user);
console.log(authResponse) // undefined

Próbowałem zwrócić wartość z wywołania zwrotnego, a także przypisywanie wyniku do zmiennej lokalnej wewnątrz funkcji i zwrócić ten, ale żaden z tych sposobów rzeczywiście zwrócił odpowiedź. Widziałem Ta odpowiedź, ale to nie pomogło.

0
Anonymous Anonymous 22 październik 2020, 00:19

1 odpowiedź

Najlepsza odpowiedź

W następnym fragmencie obie linie zawsze będą próbować uruchomić jednocześnie.

const authResponse = handleLogin(auth0Client, user);
console.log(authResponse) // undefined

console.log(authResponse) nie będzie czekać na handleLogin, aby zakończyć i wrócić authResult

authResult jest dostępny tylko wewnątrz wywołania zwrotnego

function handleLogin(client, user) {
  return client.login(
    {
      realm,
      username,
      password,
    },
    (err, authResult) => {
      if (authResult) {
        console.log(authResponse) // works!
        return authResult;
      }
    }
  );
}

Jeśli chcesz, aby Twój kod synchronicznie lub miał handleLogin(auth0Client, user);, zanim przeprowadzono resztę uruchamiania kodu, można włączyć handleLogin do funkcji, która zwraca obietnicę, która rozwiązuje się z authResponse.}. To spowoduje console.log(authResponse), aby czekać na handleLogin(auth0Client, user);.

function handleLogin(client, user) {
  return new Promise((resolve, reject) => {
    client.login(
      {
        realm,
        username,
        password,
      },
      (err, authResult) => {
        if (authResult) {
          resolve(authResult);
        }
      }
    }
  );
}
const auth0Client = initializeAuth0Client(domain, redirectUri, clientID);
const authResponse = await handleLogin(auth0Client, user);
console.log(authResponse) // works!

Jeśli robisz to w węźle, musisz upewnić się, że zadzwonisz do tego w funkcji async. Umieszczenie go wewnątrz funkcji opakowania powinno wystarczyć

async function auth() {
  const auth0Client = initializeAuth0Client(domain, redirectUri, clientID);
  const authResponse = handleLogin(auth0Client, user);
  console.log(authResponse) // works!
}

auth()
0
saulmaldonado 21 październik 2020, 22:14