Как использовать асинхронный вызов readFile, который разрешает значение в условии if (Express) - PullRequest
1 голос
/ 15 марта 2019

Я создаю конечную точку Express, где я проверяю, есть ли имя пользователя / пароль в моей базе данных (файл json)

router.post('/login', (req, res) => {
    let userData = req.body;
    if (validateEmailAndPassword(userData.username, userData.password) {
        res.send(userData);
    } else {
        res.status(401).send({ error: "Username/Password combination is incorrect." });
    }
})

const validateEmailAndPassword = (username, password) => {
    let validCreds = false;
    fs.readFile('db/users.json', 'utf8', (err, data) => {
        if (data) {
            const stream = JSON.parse(data);
            const usersFound = stream.filter(info => {
            if (info.username === username && info.password ===password) { return true; }
            })
        if (usersFound.length >= 1) { validCreds = true; }
        return validCreds;

        } else {
            throw Error(err);
        }
    })
}

'validateEmailAndPassword (userData.username, userData.password)' в строке 3первого блока кода возвращает «неопределенное» в условии if, потому что оно асинхронное.

Каков наилучший способ разрешить 'validateEmailAndPassword (userData.username, userData.password)' синхронно, чтобы я получил значениеtrue / false без использования readFileSync?

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

использовать async await и promises

router.post('/login', async(req, res) => {
    let userData = req.body;
    if (await validateEmailAndPassword(userData.username, userData.password)) {
        res.send(userData);
    } else {
        res.status(401).send({ error: "Username/Password combination is incorrect." });
    }
})

const validateEmailAndPassword = (username, password) => {
    let validCreds = false;
    return new Promise(resolve => {
    fs.readFile('db/users.json', 'utf8', (err, data) => {
        if (data) {
            const stream = JSON.parse(data);
            const usersFound = stream.filter(info => {
            if (info.username === username && info.password ===password) { return true; }
            })
        if (usersFound.length >= 1) { validCreds = true; }
        resolve(validCreds);
        return validCreds;

        } else {
            throw Error(err);

        }
    })
    })
}

Тада

0 голосов
/ 15 марта 2019

Чтобы расширить ответ @Estradiaz ...

Звучит так, как будто вы хотите использовать его синхронно, так что вы можете просто сделать его синхронным вместо асинхронного и ждать его:

readFile -> readFileSync

const validateEmailAndPassword = (username, password) => {
    let validCreds = false;
    var data = fs.readFileSync('db/users.json', 'utf8');
    if (data) {
        const stream = JSON.parse(data);
        const usersFound = stream.filter(info => {
            if (info.username === username && info.password === password)
                return true;
        });

        if (usersFound.length >= 1)
            validCreds = true;

        return validCreds;

    } else {
        throw Error(err);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...