2017-03-14 7 views
0

Ich mag dies ein Ergebnis will var rolecheck = ['289773584216358912','281531832938266625'];NodeJS async SQL-Variable

Nur geholt aus einer Datenbank, so kann ich es mit Ids zu einem anderen Array vergleichen (und ja, es sollte ein String sein)

Dies dient dazu, vor der Ausführung eines Befehls zu prüfen, ob der Benutzer eine bestimmte Rolle mit der Berechtigung für diese Rolle besitzt. Es muss also eine Funktion sein, die angerufen werden kann.

Ich habe nie gearbeitet NodeJS Asynchron-Funktionen mit, so ich habe keine Ahnung, wie diese SQL auf ein Array konvertieren:

Der Inhalt des .dann ist nur versuchen, einige Code von mir, wie es um herauszufinden, funktioniert, also ignoriere die Konsolenlogs etc. Hinweis: Die Logs geben die korrekten Rollen zurück, aber ich brauche sie nur, um sie in meiner Vergleichsfunktion zu verwenden.

sql.all("SELECT roleId FROM roles WHERE punish = 'true' and guildId = '"+guildids+"'").then(row => { 
     if (row) { 
      var rolecheck = []; 
      row.forEach(function(row){ 
       rolecheck.push(row.roleId); 
      }); 
      console.log(rolecheck); 
     } 
    }); 

Rückgabe funktioniert nicht, also brauche ich eine Abhilfe.

Hier ist, wo ich es vergleichen: (diese in Ordnung, solange rolecheck arbeitet und role.id korrekt definiert sind, was sie nicht sind es funktioniert, wenn ich die rolecheck Array hard

member.forEach(function(role){ 
    if(HasRole(rolecheck, role.id)){ 
     console.log('user has role: '+role.name); 
     return true; 
    } 
}); 
+0

Dies ist async. Sie können nicht von '.then'-Handler zurückkehren, weil der Kontext der äußeren Funktion nicht mehr existiert, wenn' .then 'ausgelöst wird. Sie müssen Ihren Scheck ** in ** dem '.then' Handler erledigen. Mit anderen Worten, Ihr Code muss verschachtelt geschrieben werden. – freakish

+0

Ich hatte Angst davor. Gibt es keine Alternative für .dann? –

+0

Nun, Sie müssen die Dinge nicht wirklich "verschachtelt" machen. Sie können immer '.then()' Aufrufe verketten, vorausgesetzt, Ihr vorheriges '.then()' gibt ein Zusicherungsobjekt zurück. Aber das hängt ganz davon ab, wie dieses 'sql' Objekt implementiert wird. – freakish

Antwort

0

In.. Falls Sie einen Knoten Version mit Asynchron verwenden können/erwarten Unterstützung, wie die Version 7, hier ist ein Weg, Versprechen-basierter Code in einer synchronen Weise zu schreiben. Dies macht es einfacher, um den Zeilenwert zu übergeben.

async function myFunction() { 
    try { 
    let member = ''; // whatever member should be 

    let row = await sql.all("SELECT roleId FROM roles WHERE punish = 'true' and guildId = '"+guildids+"'"); 

    // now you have the row available, outside of 'then' blocks 

    var rolecheck = []; 

    if (row) { 
     row.forEach(function(row){ 
     rolecheck.push(row.roleId); 
     }); 
     console.log(rolecheck); 
    } 

    member.forEach(function(role){ 
     if (HasRole(rolecheck, role.id)) { 
     console.log('user has role: '+role.name); 
     return true; 
     } 
    }); 

    } catch (error) { 
    consol.log(error.stack); 
    } 
} 

Wenn sql.all kein Versprechen zurückgibt, könntest du stattdessen etwas wie das tun, was w Es könnte auch mit Callback-basierten Funktionen arbeiten.

async function myFunction() { 
    try { 

    let row = await runSql(); 

    // everything else same as first example above 
} 

async function runSql() { 
    try { 
    return new Promise(function (resolve, reject) { 
     sql.all("SELECT roleId FROM roles WHERE punish = 'true' and guildId = '"+guildids+"'") 
     .then(row => { 
     if (row) { 
      var rolecheck = []; 
      row.forEach(function(row){ 
       rolecheck.push(row.roleId); 
      }); 
      console.log(rolecheck); 
      resolve(row); 
     } else { 
      reject('Row not found'); 
     } 
     }); 
    }); 
    } catch (error) { 
    console.log('erro') 
    } 
};