0

В моем приложении функция loginApp возвращает значение, присваиваемое глобальной (в файле) переменной currentUser, которое я затем использую. Почему undefined записывается в currentUser? Как мне исправить это, чтобы оно работало так, как я ожидал? Мне нужно знать пользователя, который вошел в мое приложение сразу после того, как он это сделал.

auth.js:

function loginApp(request, response) {
    let body = ''
request.on('data', chunk => {
    body += chunk.toString('utf8')
})

request.on('end', async () => {
    let answer = ''

    try {
        let params = JSON.parse(body)
        const user = await User.findOne({username: params['username']})

        if (!user) {
            answer = `User ${params['username']} not found`
            response.end(JSON.stringify({message: answer}))
        }

        const validPassword = bcrypt.compareSync(params['password'], user.password)
        if (!validPassword) {
            answer = 'Incorrect username or password entered '
            response.end(JSON.stringify({message: answer}))
        }
        else {
            answer = 'User exists'
            response.end(JSON.stringify({message: answer}))
            return params['username'];
        }

    } catch (ex) {
    }
})

}

index.js:

let currentUser;

const server = http.createServer((req, res) => {

...

if (req.method === 'POST') {
    ...
    if (req.url === '/login') {
        currentUser = loginApp(req, res);
    }
    ...
else if (req.method === 'GET') {
    // дальше я хочу использовать currentUser, но:
    console.log("currentUser: " + currentUser); // undefined
    ...
}

... })

Я знаю, что здесь дело в синхронности. В то время как мне надо сделать это асинхронно, но я не знаю как это сделать. Может быть, найдутся те, кто знает?

Artemka
  • 127
  • 2
  • 7
  • Нет проблем с тем, что вы присваиваете значение переменной в одной ветке if..else, а проверяете это значение в другой? – br3t Apr 04 '21 at 19:49
  • @br3t, а как ещё я верну значение из функции, которая отрабатывает по пост-запросу, а значение, которое она возвращает, нужно в гет-запросе? это чистый node js, не express, поэтому приходится чудить – Artemka Apr 04 '21 at 19:52
  • 1
    У Вас loginApp ничего не возвращает, поэтому результатом ее вызова всегда и будет undefined. Возвращайте хотя бы промис. – Yaant Apr 04 '21 at 19:53
  • @Yaant, можете подробнее об этом? – Artemka Apr 04 '21 at 19:57
  • 1
    function loginApp(...) { return new Promise(resolve => {...; request.on('end', async () => {...; resolve(params['username'); ,,,})})}. Как-то так, если навскидку. – Yaant Apr 04 '21 at 20:10

0 Answers0