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

0 głosów
98 wizyt
pytanie zadane 4 stycznia 2021 w JavaScript przez Bartx Bywalec (2,100 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 VIP (136,880 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,100 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 (171,780 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 58 wizyt
0 głosów
1 odpowiedź 70 wizyt
+2 głosów
2 odpowiedzi 54 wizyt

86,483 zapytań

135,239 odpowiedzi

300,477 komentarzy

57,229 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...