Node JS Async & Await

di il
9 risposte

Node JS Async & Await

Salve a tutti sto iniziando a programmare in Javascript Node Js.

sto cercando di comprendere async & await ora sono a chiedervi un consulto ho creato il seguente codice funzionante, volevo capire se ho compreso bene.

In questo modulo gestisco la richiesta al sql funzione asicrona

async function getContactsAllAnagrafica() {
    try {
      await sql.connect(config);
      const result = await sql.query`SELECT * FROM Connector.AnagraficaConnector`;
      return { status: 200, data: result.recordset};
    }catch(err){
      return { status: 500, data: { message: err.message}};
    }finally{
    sql.close();
  }
}

Fondamentalmente restituisco un oggetto con la proprietà status che indica lo status della risposta http e la proprietà data che contiene l'oggetto della risposta o nel catch il messaggio di errore

In questo modulo gestisco le route

router.get("/allAnagrafica", (req, res) => {
  getContactsAllAnagrafica().then((data) =>{
    res.status(data.status).json(data.data);
  })
});

Ora la domanda è la seguente:

Nella route devo utilizzare .then e non posso utilizzare async & await perchè sono già utilizzati nella funzione getContactsAllAnagrafica() ?

Quindi è corretto il codice che ho scritto perchè gestisco l'errore nella funzione getContactsAllAnagrafica() e nella route è sufficente .then() l'utilizzo di .catch() risulterebbe nullo in quanto gli errori vengono gestiti nella funzione getContactsAllAnagrafica() e la route di conseguenza elabora solo la risposta?

Un grazie anticipato

9 Risposte

  • Re: Node JS Async & Await

    22/05/2025 - mayers81 ha scritto:

    Quindi è corretto il codice che ho scritto perchè gestisco l'errore nella funzione getContactsAllAnagrafica() e nella route è sufficente .then() l'utilizzo di .catch() risulterebbe nullo in quanto gli errori vengono gestiti nella funzione getContactsAllAnagrafica() e la route di conseguenza elabora solo la risposta?

    Ciao,

    si , è corretto.
    Potresti anche utilizzare entrambi ma non è obbligatorio.
    il fatto che getContactsAllAnagrafica() sia async non vieta di usare anche await nella route
    "la route di conseguenza elabora solo la risposta?" Si, è corretto.... se non usi throw, va bene così.

  • Re: Node JS Async & Await

    Grazie mille inanzi tutto per la tua risposta.

    Ok dovrei quindi dovrei 

    router.get("/allAnagrafica", async (req, res) => {
      result = await getContactsAllAnagrafica()
        res.status(result.status).json(result.data);
      })
    });

    Sostanzialmente il codice risulta essere più leggibile giusto?

    In questo caso non devo neanche usare try{} catch{} perchè non uso throw giusto? quindi gestendo gli errori nella funzione 

    async function getContactsAllAnagrafica() {
        try {
          await sql.connect(config);
          const result = await sql.query`SELECT * FROM Connector.AnagraficaConnector`;
          return { status: 200, data: result.recordset};
        }catch(err){
          return { status: 500, data: { message: err.message}};
        }finally{
        sql.close();
      }

    E rispondendo con un oggetto "risposta" gestisco gli errori nella funzione ed in base a quello la rotta elabora la risposta?

    Hai per caso una lettura da consigliarmi sull'argomento callback promisies e async & await

  • Re: Node JS Async & Await

    Ciao,

    sì... in route non serve il try catch perché la funzione getContactsAllAnagrafica non rilancia errori ma restituisce sempre lo status e data.
    Più leggibile e semplice

    Prova a leggere qui :
    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
    https://nodejs.org/api/errors.html

    Nota:
    qui hai scritto male ... verifica la sintassi:

    router.get("/allAnagrafica", async (req, res) => {
      const result = await getContactsAllAnagrafica();
      res.status(result.status).json(result.data);
    });

    :
    Pertanto abbiamo :

    async function getContactsAllAnagrafica() {
      try {
        await sql.connect(config);
        const result = await sql.query`SELECT * FROM Connector.AnagraficaConnector`;
        return { status: 200, data: result.recordset };
      } catch (err) {
        return { status: 500, data: { message: err.message } };
      } finally {
        sql.close();
      }
    }
    

    e il try cath gestisce e ritorna sempre un Status e Data

    Mentre in Route nessun .then e try cath, non serve in questo caso :

    router.get("/allAnagrafica", async (req, res) => {
      const result = await getContactsAllAnagrafica();
      res.status(result.status).json(result.data);
    });
    
  • Re: Node JS Async & Await

    Scusami il codice funziona anche con

    router.get("/allAnagrafica", async (req, res) => {
      result = await getContactsAllAnagrafica();
      res.status(result.status).json(result.data);
    });

    Però non è corretto perhè viene creata di default come var quindi globale e non limitata alla funzione?

    Grazie mille per il tuo aiuto

  • Re: Node JS Async & Await

    Ciao,

    se viene usata senza dichiarazione esplicita const, let o var... allora diventa una variabile globale.

    quindi il codice corretto sarà :

    router.get("/allAnagrafica", async (req, res) => {
      const result = await getContactsAllAnagrafica();
      res.status(result.status).json(result.data);
    });
    

    Le variabili si devono sempre dichiarare in funzione dell'uso che ne farai

    Spiega come mai hai tolto la dichiarazione const per la variabile result

    [Edit]

    ma per caso hai già utilizzato la variabile result nello stesso scope ?
    In questo caso potresti cambiare il nome ... per esempio:

    router.get("/allAnagrafica", async (req, res) => {
      const resultAnagrafica = await getContactsAllAnagrafica();
      res.status(resultAnagrafica.status).json(resultAnagrafica.data);
    });

    Non sarà che da qualche altra parte hai utilizzato la variabile result senza dichiararla (quindi risulta globale) e adesso in questo contesto ti da problemi ?

  • Re: Node JS Async & Await

    Ciao result era cosi utilizzato

    router.get("/allAnagrafica", async (req, res) => {
      result = await getContactsAllAnagrafica();
      res.status(result.status).json(result.data);
    });
    
    
    router.get("/allReferente", async (req, res) => {
      result = await getContactsAllReferente();
      res.status(result.status).json(result.data);
    });

    O modificato in

    router.get("/allAnagrafica", async (req, res) => {
      const result = await getContactsAllAnagrafica();
      res.status(result.status).json(result.data);
    });
    
    
    router.get("/allReferente", async (req, res) => {
      const result = await getContactsAllReferente();
      res.status(result.status).json(result.data);
    });

    Però entrambi i codici funzionavano

  • Re: Node JS Async & Await

    28/05/2025 - mayers81 ha scritto:

    router.get("/allAnagrafica", async (req, res) => {
      const result = await getContactsAllAnagrafica();
      res.status(result.status).json(result.data);
    });
    
    
    router.get("/allReferente", async (req, res) => {
      const result = await getContactsAllReferente();
      res.status(result.status).json(result.data);
    });

    Però entrambi i codici funzionavano

    Ciao,

    non conosco il tuo codice completo e non posso analizzare in profondità il problema che segnali.

    Ma quello che è certo è che:

    • result è una Variabile che riceverà un certo Valore da una certa funzione
    • questa variabile se non deve essere di tipo globale, deve essere dichiarata come tipo const o let  :
      • dichiarazione di tipo const : il valore che contiene può essere solo letto, non può essere modificato
      • dichiarazione di tipo let : il valore che contiene può essere letto e modificabile

    :
    Il caso specifico :

    •  la variabile deve essere dichiarata con il tipo const in quanto :
      • viene usata per ricevere un valore che deve essere solo letto
      • viene usata in ambito locale e avrà vita solo all'interno di quel processo (di quel blocco di codice)

    :
    Utilizzo e Errori :

    • la variabile non può essere utilizzata come "const result"
      • se è già stata utilizzata in ambito globale
        • in questo caso si riceve errore
    • la variabile deve esere impostata come variabile di tipo locale
      • definire una variabile di tipo "const"
    • la variabile può essere denominata a proprio piacimento
      • se la variabile result, dichiarata come const, crea problemi o restituisce errori o risultati imprevisti:
        • indica che è già stata utilizzata in modo Globale
          • cambiare il nome della variabile
            • per esempio utilizzare const resultA  e/o const resultB

    :

    Questo è il modo corretto di lavorare con le variabili. 

    Per esempio impostare nel proprio codice dichiarando le variabili come sotto  riportato:

    router.get("/allAnagrafica", async (req, res) => {
      const resultA = await getContactsAllAnagrafica();
      res.status(resultA.status).json(resultA.data);
    });
    
    
    router.get("/allReferente", async (req, res) => {
      const resultB = await getContactsAllReferente();
      res.status(resultB.status).json(resultB.data);
    });

    Verificare i risultati dopo aver dichiarato le variabili come appena mostrato

    Se non funziona o restituisce risultati imprevisti perchè è necessario utilizzare una "variabile globale", allora si deve analizzare il codice completo per determinare la logica e il flusso corretto e delle informazioni e come devono essere trattate.

    Fare questo test e fai sapere
    ciao  ;-)

  • Re: Node JS Async & Await

    Ciao ho ricontrollato tutto il codice e sistemato eventuali non dichiarazioni di result ora utilizzo il tuo approccio resultA B C ecc. così da non evitare errori mi serve solo tanta pratica grazie mille per il supporto sei gentilissimo

  • Re: Node JS Async & Await

    30/05/2025 - mayers81 ha scritto:

    Ciao ho ricontrollato tutto il codice e sistemato eventuali non dichiarazioni di result ora utilizzo il tuo approccio resultA B C ecc. così da non evitare errori mi serve solo tanta pratica grazie mille per il supporto sei gentilissimo

    Ok, ma non dichiarare mille variabili con mille nomi diversi per ogni funzione... ti bastano quelle poche, (sempre le stesse)  trattate come variabili locali che hanno vita ed effetto solo all'interno di ogni funzione.
    Poi uscito dalle funzioni, gli stessi nomi li puoi riutilizzare all'infinito sempre definendo le variabili come locali ti tipo Const o Let 

    Per esempio per ricevere il valore di ritorno dlle query potresti:

    • const resultQry = .....

    :

    E adesso in ogni funzione, quando hai necessità, la ridefinisci allo stesso modo "const resultQry = ..." 

    Così facendo la  "const resulQry" risulta temporanea e fuori da quella specifica funzione non esiste più.

    Poi facendo esperienza vedrai che adotterai sempre  più una sintassi pulita, semplice e rileggibile anche a distanza di tempo.
    Buon lavoro, alla prox 

Devi accedere o registrarti per scrivere nel forum
9 risposte