Asyn c функция выполняется в неправильном порядке - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь написать функцию в nodejs, которая считывает информацию о пользователях из файла json (я знаю, что это небезопасно, просто упражнение), регистрирует, верны ли данные, и отправляет ответ. Я написал эту функцию asyn c:

async function getUser(sUsername) {
    fs.readFile('db/users.json', (err, data) => {
        if (err) {
            console.log(`An error has occured in getUser function`)
        }
        let users = JSON.parse(data)
        userNamesFromFile = Object.keys(users);
        console.log(`Data is: ${data}`)
        console.log(`Users after parsing are: ${userNamesFromFile}\n`)
        for (currUser in userNamesFromFile) {
            `Currently checking comparing to user: ${currUser}\n`
            if (currUser === sUsername) {
                var oUser = new User(currUser, users[currUser].password);
                return oUser;   
            }
        }
    })
}

И я называю это здесь:

getUser(oBody.username.toLowerCase()).then(oFoundUser => {
            console.log(`Finished the async function, found user ${oFoundUser}`)
            if (oFoundUser) {
                if (oBody.password.toString() === oFoundUser.password.toString()) {
                    console.log("Login successful")
                    res.statusCode = 200
                    req.session.username = oFoundUser.username;
                }
                else {
                    console.log("Wrong password")
                    res.statusCode = 401;
                }
            }
            else {
                res.statusCode = 401
                console.log("No user with such a name exists")
            }
            res.send();
        })

Это журнал, который я получаю с сервера при вводе правильных данных пользователя :

Finished the async function, found user undefined
No user with such a name exists
POST /login 401 7.822 ms - -
Data is: {
  "testuser1": {
    "password": 12345
  },
  "testuser2": {
    "password": 6789
  }
}
Users after parsing are: testuser1, testuser2

Похоже, он говорит, что функция asyn c запускается и только тогда записывает информацию, которую я регистрирую, с помощью функции asyn c. Он даже не попадает в циклы, сравнивая пользователей с тем, что я только что получил из моего json файла. Я помещаю то, что я хочу сделать с возвращаемым значением функции asyn c в .then. Разве он не должен работать в том порядке, в котором я его ожидаю?

Спасибо,

Бен

1 Ответ

0 голосов
/ 27 марта 2020

Я нашел решение. Я думаю, что использование обратного вызова является правильным ответом. Если я правильно понимаю, функция asyn c не возвращает обещание, которое разрешается как возвращаемое мной значение «return», но я могу вызвать возврат внутри разрешения в функции asyn c. Это правильно?

async function getUser(sUsername, callback) {
    return fs.readFile('db/users.json', (err, data) => {
        if (err) {
            console.log(`An error has occured in getUser function`)
        }
        let users = JSON.parse(data)
        userNamesFromFile = Array.from(Object.keys(users));
        for (let i = 0; i < userNamesFromFile.length; i++) {
            currUser = userNamesFromFile[i]
            if (currUser === sUsername) {
                var oUser = new User(currUser, users[currUser].password);
                console.log(`Returnign callback with ${oUser.toString()}` )
                return callback(oUser);
            }
            if (i === userNamesFromFile.length - 1) {
                return callback(false)
            }
        }
    })
}
getUser(oBody.username.toLowerCase(), oFoundUser => {
            console.log(`Finished the async function, found user ${oFoundUser}`)
            if (oFoundUser) {
                if (oBody.password.toString() === oFoundUser.password.toString()) {
                    console.log("Login successful")
                    res.statusCode = 200
                    req.session.username = oFoundUser.username;
                }
                else {
                    console.log("Wrong password")
                    res.statusCode = 401;
                }
            }
            else {
                res.statusCode = 401
                console.log("No user with such a name exists")
            }
            res.send();
        })

Спасибо,

Бен

...