• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Funkcja Javascript zwraca "undefined" mimo tego, że może zwrócić tylko "true/false".

VPS Starter Arubacloud
0 głosów
208 wizyt
pytanie zadane 4 stycznia 2021 w JavaScript przez Bartx Bywalec (2,120 p.)
zamknięte 4 stycznia 2021 przez Bartx

Witajcie, mam problem z funkcją (isAdmin) której zadaniem jest zwracanie wartości true albo false, jednak zwraca ona zawsze wartość "undefined". W czym może tkwić problem?

function isAdmin(req, res) {
    dbConnection.getConnection((err, connection) => {
        connection.query(`SELECT id FROM users WHERE id = '${req.session.userId}' AND admin = 1`, (err, rows) => {
            connection.release();
            if (err) throw err;
            if (rows.length == 1) return true;
            else return false;
        });
    });
}

exports.getDbTable = (req, res, next) => {
    let table = req.params.table;
    console.log(isAdmin(req, res)); // undefined
    if (isAdmin(req, res) != true && table == "users") return res.status(401).json({error: 6, errorMsg: "Access Denied"});
    dbConnection.getConnection((err, connection) => {
        connection.query(`SELECT * FROM ${table}`, function (err, rows) {
            if (err) throw err;
            else {
                console.log(rows);
            }
            connection.release();
        });
    });
}

 

komentarz zamknięcia: Samodzielne rozwiązanie problemu
1
komentarz 4 stycznia 2021 przez tangarr Mędrzec (154,780 p.)
Z góry zaznaczę, że nie znam się na programowaniu asynchronicznym w JavaScripcie.

Funkcja isAdmin nie zwraca żadnej wartości. Wewnątrz niej definiujesz funkcję asynchroniczną która tworzy kolejną funkcję asynchroniczną. W żaden sposób nie przechwytujesz wyniku wewnętrznej funkcji asynchronicznej.

1 odpowiedź

0 głosów
odpowiedź 4 stycznia 2021 przez Bartx Bywalec (2,120 p.)

Rozwiązane poprzez zastosowanie obietnic:

function isAdmin(req, res) {
    return new Promise(function (resolve, reject) {
        dbConnection.getConnection((err, connection) => {
            connection.query(`SELECT id FROM users WHERE id = '${req.session.userId}' AND admin = 1`, (err, rows) => {
                connection.release();
                if (err) throw err;
                if (rows.length == 1) resolve();
                else reject();
            });
        });
    });
    
}

exports.getDbTable = (req, res, next) => {
    let table = req.params.table;
    if (table == "users") {
        isAdmin(req, res)
        .catch(function () {
            return res.status(401).json({error: 6, errorMsg: "Access Denied"});
        });
    }
    dbConnection.getConnection((err, connection) => {
        connection.query(`SELECT * FROM ${table}`, function (err, rows) {
            if (err) throw err;
            else {
                console.log(rows);
            }
            connection.release();
        });
    });
}

 

1
komentarz 4 stycznia 2021 przez ScriptyChris Mędrzec (190,190 p.)

Możesz też skorzystać z metody promisify z modułu utils, żeby owinąć metodę dbConnection.getConnection w promisa i zwrócić go bezpośrednio z funkcji isAdmin - wtedy nie będziesz musiał tworzyć promisa samodzielnie.

Podobne pytania

+1 głos
0 odpowiedzi 276 wizyt
0 głosów
1 odpowiedź 110 wizyt
+2 głosów
2 odpowiedzi 165 wizyt

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...