3 votes

Comment importer une valeur dans node js seulement après qu'elle ait été exportée ailleurs un peu plus tard ?

Je suis en train de me familiariser avec le SSO et j'essaie de le faire sans la méthode conventionnelle. User classe/objet. Je suis novice en matière de programmation asynchrone et j'ai des difficultés à gérer le flux de données. Je suis bloqué à un moment où j'ai réussi à exporter un objet boolean mais mon import (dans un autre module) obtient une valeur de undefined . Je pense que c'est parce que l'importation n'attend pas que l'instruction d'exportation correspondante soit exécutée en premier. Comment faire pour que cette instruction et tout le code qui suit attendent ?

Je ne sais pas quoi essayer dans ce cas.

Module qui exporte usrFlag

const request = require("request");
let usrFlag = false; // assuming user doesn't already exist.

function workDB(usr_id, usr_name, dateTimeStamp) {

  //some code excluded - preparing selector query on cloudant db

  request(options, function (error, response, body) {
    if (error) throw new Error(error);

    if (body.docs.length == 0) addUsr(usr_id, usr_name, dateTimeStamp);
    else {
      xyz(true); //This user already exists in cloudant
      console.log('User already exists since', body.docs[0].storageTime);
    }
  });
}

async function setUsrFlag(val) { usrFlag = val; }

async function xyz(val) {
  await setUsrFlag(val);

  //module.exports below does not execute until usrFlag has the correct value.
  //so value is not exported until usrFlag has been properly set.

  console.log(usrFlag); 
  module.exports.usrFlag = usrFlag;
}

Module qui importe cette valeur

const usrP = require('../config/passport-setup');
const dbProcess = require('../dbOps/dbProcessLogic'); // <-- This is import

router.get('/google/redirect', passport.authenticate('google'), (req, res) => {
  dbProcess.workDB(usrP.usrPrf.id, usrP.usrPrf.displayName, new Date());

  // Instead of true/false, I see undefined here.
  console.log(dbProcess.usrFlag); 
});

Je m'attends à ce que la fonction require du module d'importation attende que le module d'exportation lui envoie toutes les valeurs requises. Cependant, je sais que cela ne va probablement pas se produire sans que je lui dise explicitement de le faire. Ma question est la suivante : comment ?

4voto

Lone Ranger Points 547

J'ai donc modifié une partie du code, afin de pouvoir travailler facilement dessus.

Module qui exporte usrFlag

// const request = require("request");
let usrFlag = false; // assuming user doesn't already exist.

function workDB(usr_id, usr_name, dateTimeStamp) {

    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            xyz(true).then(function () {
                resolve('done');
            })
        }, 1000);
    });
}

function setUsrFlag(val) { usrFlag = val; }

function xyz(val) {
    return new Promise(function (resolve, reject) {
        setUsrFlag(val);
        module.exports.usrFlag = usrFlag;
        resolve('done');
    });

}

module.exports = {
    usrFlag,
    workDB
}

Module qui importe ce value

const dbProcess = require('../dbOps/dbProcessLogic'); // <-- This is import

dbProcess.workDB().then(function () {
    console.log(dbProcess.usrFlag);
})

Maintenant, quand vous exécutez le second fichier, vous obtenez usrFlag comme vrai. J'ai utilisé setTimeout pour imiter une requête.

Désolé si j'ai massacré une partie de votre code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X