В моем приложении функция 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
...
}
...
})
Я знаю, что здесь дело в синхронности. В то время как мне надо сделать это асинхронно, но я не знаю как это сделать. Может быть, найдутся те, кто знает?
if..else, а проверяете это значение в другой? – br3t Apr 04 '21 at 19:49loginAppничего не возвращает, поэтому результатом ее вызова всегда и будетundefined. Возвращайте хотя бы промис. – Yaant Apr 04 '21 at 19:53function loginApp(...) { return new Promise(resolve => {...; request.on('end', async () => {...; resolve(params['username'); ,,,})})}. Как-то так, если навскидку. – Yaant Apr 04 '21 at 20:10