Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

161
Vistas
NodeJS responde antes de que se realice la función

Estoy escribiendo una API con NodeJS y Express para un proyecto escolar y tengo problemas con lo siguiente:

La función getAuthUserId decodifica el token JWT y obtiene la identificación del usuario en el servidor mongoDB.

Llamo a esta función en una llamada REST "/user/authTest". Pero cuando llamo a esto, el servidor responde antes de que la base de datos pueda devolver la identificación y la variable UId no está definida. Como puede ver, el Id realmente se encuentra. ¿Alguna idea sobre cómo puedo solucionar esto?

El código de llamada API:

 apiRoutes.post('/user/authTestID', function(req, res) { var UId = getAuthUserId(req, res); console.log(UId); if (UId) { res.sendStatus(200); }else{ res.sendStatus(400); } });

La función:

 function getAuthUserId(req, res) { var user = new User(); var token = user.getToken(req.headers); if (token) { var decoded = jwt.decode(token, config.secret); User.findOne({ name: decoded.name }, function(err, user) { if (err) throw err; if (!user) { res.status(403).send({success: false, msg: 'Authentication failed. User not found.'}); return false } else { console.log('Auth for ' + user.name + ' ' + user._id); return user._id } }); } else { res.status(403).send({success: false, msg: 'No token provided.'}); return ''; } }

La salida de la terminal:

 [nodemon] restarting due to changes... [nodemon] starting `node server.js` Connected to MongoDB undefined ::ffff:192.168.0.111 - POST /user/authTestID HTTP/1.1 400 11 - 175.006 ms Auth for test 58f8954c3602b80552b6f1fb

¡Gracias por adelantado!

about 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Necesitas hacer una promesa, como esta.

API

 apiRoutes.post('/user/authTestID', function(req, res) { getAuthUserId(req, res).then(function (UId) => { console.log(UId); if (UId) { res.sendStatus(200); }else{ res.sendStatus(400); } }); }, function(err) { console.log(err.msg) res.status(err.status).send(err.msg); });

Función

 function getAuthUserId(req, res) { return new Promise(function(resolve, reject){ var user = new User(); var token = user.getToken(req.headers); if (token) { var decoded = jwt.decode(token, config.secret); User.findOne({ name: decoded.name }, function(err, user) { if (err) throw err; if (!user) { reject({status: 403, msg: 'Authentication failed. User not found.'}); } else { console.log('Auth for ' + user.name + ' ' + user._id); resolve(user._id) } }); } else { reject({status: 403, msg: 'No token provided.'}); } }) }
about 4 years ago · Santiago Trujillo Denunciar

0

getAuthUserId obtiene el valor en una DEVOLUCIÓN DE LLAMADA! . No puede esperar que devuelva valores de él. Lo más rápido que puede hacer algo como a continuación.

 apiRoutes.post('/user/authTestID', function (req, res) { var user = new User(); var token = user.getToken(req.headers); if (token) { var decoded = jwt.decode(token, config.secret); User.findOne({ name: decoded.name }, function (err, user) { if (err) throw err; if (!user) { return res.status(403).send({success: false, msg: 'Authentication failed. User not found.'}); } else { console.log('Auth for ' + user.name + ' ' + user._id); return res.send(user._id) } }); } else { return res.status(403).send({success: false, msg: 'No token provided.'}); // return ''; } });

Intente usar la biblioteca Promise como Bluebird

about 4 years ago · Santiago Trujillo Denunciar

0

El comentario de James parece un recurso bueno y completo sobre las llamadas asincrónicas. Como han mencionado otros, no puede devolver valores dentro de una devolución de llamada. Puede usar una biblioteca Promise, o puede cambiar su función getAuthUserId para recibir una devolución de llamada y tener su lógica console.log allí:

Ejemplo:

Código de llamada de la API:

 apiRoutes.post('/user/authTestID', function(req, res) { getAuthUserId(req, res, function(UId) { // we're in a your new callback console.log(UId); if (UId) { res.sendStatus(200); }else{ res.sendStatus(400); } }); });

Código de función

 // note new callback param function getAuthUserId(req, res, callback) { var user = new User(); var token = user.getToken(req.headers); if (token) { var decoded = jwt.decode(token, config.secret); User.findOne({ name: decoded.name }, function(err, user) { if (err) throw err; if (!user) { res.status(403).send({success: false, msg: 'Authentication failed. User not found.'}); callback(false) // no more return, call callback with value } else { console.log('Auth for ' + user.name + ' ' + user._id); callback(user._id) // no more return, call callback with value } }); } else { res.status(403).send({success: false, msg: 'No token provided.'}); callback(''); // no more return, call callback with value } }
about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda