sql >> Database >  >> RDS >> Mysql

Knooppuntdatabase-aanroepen ongedaan maken

U kunt geneste database-aanroepen verwijderen met promises .

Aangezien je zei dat je mysql gebruikt bibliotheek voor interactie met de database, biedt deze bibliotheek helaas geen op beloften gebaseerde API. Dus om geneste database-aanroepen in uw code te verwijderen, moet u een op beloften gebaseerde wrapper maken rond de call-back-versie van database-aanroepen.

Voor een algemeen overzicht van wat beloften zijn en hoe ze werken, zie de volgende links:

Hieronder volgt een voorbeeld van hoe u een op beloften gebaseerde wrapper kunt maken en die wrapper vervolgens kunt gebruiken om geneste database-aanroepen te verwijderen.

Deze op belofte gebaseerde wrapper is slechts een functie die een belofte retourneert. Het creëert een belofte-instantie, verpakt de onderliggende database-aanroep en uiteindelijk wanneer de database-aanroep de gegevens retourneert, meldt het uw code.

function getCats() {
   return new Promise((resolve, reject) => {
       // make the database call
       db.cats((error, cats) => {
           // in case of an error, reject the promise by
           // calling "reject" function
           // Also pass the "error" object to the "reject" function
           // as an argument to get access to the error message 
           // in the code that calls this "getCats" function
           if (error) {
              reject(error);
              return;
           }
           
           // if there was no error, call "resolve" function
           // to resolve the promise. Promise will be resolved 
           // in case of successful database call
           // Also pass the data to "resolve" function
           // to access this data in the code that calls this
           // "getCats" function
           resolve(cats);
       });
   });
}

Nu in uw routehandlerfunctie, in plaats van db.cats(...) . aan te roepen , noem dit getCats wrapper-functie.

Er zijn twee manieren om de functie aan te roepen die een belofte teruggeeft:

  • Promise-chaining (Ga voor meer informatie naar de hierboven genoemde links)
  • async-await syntaxis (aanbevolen)

Het volgende codevoorbeeld gebruikt async-await syntaxis. Markeer hiervoor eerst de routebehandelaarfunctie als async door de async . te gebruiken trefwoord voor de function trefwoord. Als we dit doen, kunnen we await . gebruiken trefwoord binnen deze route-handlerfunctie.

app.get('/pets', async function(req, res, next) {
    try {
       const cats = await getCats();
       // similar wrappers for other database calls
       const dogs = await getDogs();
       const budgies = await getBudgies();
       
       // render the pub template, passing in the data
       // fetched from the database 
       ...

     catch (error) {
       // catch block will be invoked if the promise returned by
       // the promise-based wrapper function is rejected
       // handle the error appropriately
     }
});

Bovenstaand codevoorbeeld laat alleen zien hoe de db.cats(...) database roept een op belofte gebaseerde wrapper aan en gebruikt die wrapper om de gegevens uit de database te halen. Op dezelfde manier kunt u wrappers maken voor db.dogs(...) en db.budgies(...) oproepen.

In plaats van een aparte op belofte gebaseerde wrapper te maken voor elke database-aanroep, moet je idealiter een herbruikbare op belofte gebaseerde wrapper-functie maken die een functie inneemt om aan te roepen en die functieaanroep in een belofte verpakt, net zoals getoond in het bovenstaande codevoorbeeld, d.w.z. getCats functie.

Parallelle database-oproepen

Een belangrijk ding om op te merken in de bovenstaande code in de routebehandelaarfunctie

const cats = await getCats();
const dogs = await getDogs();
const budgies = await getBudgies();

is dat dit zal leiden tot sequentiële database-aanroepen die wel of niet wat je wilt.

Als deze database-aanroepen niet van elkaar afhankelijk zijn, kunt u de op belofte gebaseerde wrappers parallel aanroepen met Promise.all() methode.

Het volgende codevoorbeeld laat zien hoe u uw op belofte gebaseerde wrapper-functies parallel kunt aanroepen met Promise.all() .

app.get('/pets', async function(req, res, next) {
    try {
       // "petsData" will be an array that will contain all the data from 
       // three database calls.
       const petsData = await Promise.all([getCats(), getDogs(), getBudgies()]);
       
       // render the pub template, passing in the data
       // fetched from the database 
       ...
 
     catch (error) {
       ...
     }
 });

Ik hoop dat dit voldoende is om je te helpen de geneste database-aanroepen in je huidige code kwijt te raken en beloftes in je code te gaan gebruiken.



  1. Maandag instellen als eerste dag van de week in SQL Server

  2. Hoe rijnum te gebruiken

  3. maak een aangepaste functie voor datumverschil met uitzondering van weekends en feestdagen in oracle sql

  4. Wat is er precies vergrendeld bij het gebruik van MySQL's FOR UPDATE-vergrendeling?