Estoy creando la funcionalidad de inicio de sesión para mi aplicación con una llamada asíncrona a mi API. Mi problema es que, aunque Express arroja un error, .then() aún se ejecuta con el error y no con la respuesta real del usuario y del token. No estoy seguro de por qué la función de inicio de sesión no 'captura' el error y en su lugar ejecuta el código dentro de .then().
Mi función expresa:
// express funciton to login a user app.post('/api/users/login', (req, res) => { const { email, password } = req.body database.getUser(email, password, (error, user) => { console.log(error) if (error) { res.send({ error }) //errors are being handled here and are returned in the result of my frontend API call return } const token = jwt.generateToken({ userId: user.id, name: user.name, email: user.email }) res.send({ token: token, user:user }) }) }) //getUser function with mySQL query function getUser(email, password, callback) { const query = ` SELECT id, name, email, password FROM users WHERE email = ? ` const params = [email] connection.query(query, params, (error, results, fields) => { if (!results || results.length === 0) { callback(Error("Email is incorrect")) return } const user = results[0] bcrypt.compare(password, user.password, (error, same) => { console.log(error) if (error) { callback(error) return } if (!same) { callback(Error("Password is incorrect")) return } callback(null, user) }) }) } exports.getUser = getUserMi función de inicio de sesión en Next.js:
const login = async ({ email, password }) => { return await axios.post('http://localhost:4200/api/users/login', { email: email, password: password }) .then((result) => { //when backend throws error, they are contained here as "result.error" still running these lines of code sessionStorage.setItem('token', result.data.token); axios.defaults.headers.common['Authorization'] = "Bearer " + result.data.token; console.log('user signed in'); }) .catch((err) => { //want errors to be directed here instead so I can properly handle them within the UI console.error("Username or password is incorrect!!") }) };Donde tiene .catch(error) solo se producirá un error si hay un problema con la promesa de axios que se puede completar.
En este caso, la promesa de axios se completa correctamente, sin embargo, luego se le devuelve un código de error válido por el cual no se puede completar el inicio de sesión.
Por lo tanto, un enfoque estaría dentro de su .then(result) para buscar ese tipo de resultado y hacer algo.
Entonces algo como
.then((result) => { if (result.error) { ... return an error message to user ... } else { sessionStorage.setItem('token', result.data.token); axios.defaults.headers.common['Authorization'] = "Bearer " + result.data.token; console.log('user signed in');} })