• 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".

Object Storage Arubacloud
0 głosów
212 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,860 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 291 wizyt
0 głosów
1 odpowiedź 112 wizyt
+2 głosów
2 odpowiedzi 170 wizyt

92,565 zapytań

141,418 odpowiedzi

319,602 komentarzy

61,951 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...