Soy nuevo en JavaScript/NodeJS y me cuesta entender lo que está pasando aquí. Estoy escribiendo una función que realizará alguna acción basada en la respuesta de una solicitud de publicación de API dentro de una función separada. Por ahora, esa acción solo muestra un mensaje de falla o éxito.
El siguiente código (dentro de un archivo app.js) simplemente está destinado a capturar las entradas del usuario, pasarlas a la función login_user (dentro de un archivo authenticate.js) y mostrar un mensaje basado en la respuesta de login_user.
const { login_user } = require('./authenticate'); // Other requirements // App initialization app.post('/auth', function (req, res) { let username = req.body.username; let password = req.body.password; let response = login_user(username, password); if (response == 204) { res.send("Success"); } else { res.send("Failure"); } });El siguiente código (dentro de authenticate.js) acepta la entrada del usuario, realiza una llamada a la API y devuelve el código de estado de la respuesta.
const axios = require('axios'); const querystring = require('querystring'); function login_user(username, password) { var data = { j_username: username, j_password: password }; axios.post("https://fakeurl.com", querystring.stringify(data)) .then(function (response) { return response.status; }) .catch(function (error) { return response.status; }); } module.exports = { login_user }Lo que sucede es que, una vez que se llama a la función login_user, el código continúa ejecutándose y va directamente a la cláusula else de la declaración if/else, lo que siempre resulta en una falla. Me gustaría esperar a que se devuelva la respuesta antes de ejecutar la instrucción if/else.
Intenté usar async/await con esta configuración...
app.post('/auth', async function (req, res) { let username = req.body.username; let password = req.body.password; let response = await login_user(username, password); if (response == 204) { res.send("Success"); } else { res.send("Failure"); } });... pero no tuve suerte. ¿Hice esto incorrectamente?
Prueba esto,
const services = require('./authenticate'); app.post('/auth', async function (req, res) { try { let username = req.body.username; let password = req.body.password; let response = await services.login_user(username, password); if (response == 204) { res.send("Success"); } else { res.send("Failure"); } } catch (e) { return res.status(500).json({ status: 500, message: e.message }); } });Y,
Dentro del archivo authenticate.js
const axios = require('axios'); const querystring = require('querystring'); exports.login_user = async function (username, password) { try { let data = { j_username: username, j_password: password }; return axios.post("https://fakeurl.com"`enter code here`, querystring.stringify(data)) .then(function (response) { return response.status; }) .catch(function (error) { return response.status; }); } catch (e) { console.log(e); throw Error(`Failed to evaluate transaction: ${e}`) } }Use Async y espere llamadas de función en ambos archivos.
Prueba esto
function login_user(username, password) { var data = { j_username: username, j_password: password }; return axios.post("https://fakeurl.com", querystring.stringify(data)) .then(function (response) { return response.status; }) .catch(function (error) { return response.status; }); } app.post('/auth', async function (req, res) { let username = req.body.username; let password = req.body.password; let response = await login_user(username, password); if (response == 204) { res.send("Success"); } else { res.send("Failure"); } });Axios devuelve una promesa
Para obtener más información, puede consultar esta respuesta aquí: Devolver datos de la API de Axios