Soy nuevo en Express.js y estoy tratando de crear un acortador de URL.
Cuando el usuario navega a domain.com/r/, consulto la base de datos para obtener el parámetro y obtengo la URL real.
Uso res.redirect para intentar redirigir a su URL almacenada, pero falla con 'res.redirect no es una función'.
Por favor, vea el fragmento a continuación:
router.get('/r/:shortUrl', function(req, res) { connectDatabase.then( checkDatabase(req.params.shortUrl) .then( res => { console.log('checkdatdabase res => ' + res); //res = 'https://www.google.com' res.redirect(res); //TypeError: res.redirect is not a function }) .catch(e => { //executed due to above error console.error(e); res.redirect(307, '/home'); }) ) });Cualquier consejo sería muy apreciado ya que este es un proyecto de aprendizaje para mí.
Tienes dos variables llamadas res .
Uno, pasado a la devolución de llamada que pasa a get() es un objeto de respuesta que tiene un método de redirect .
El otro es el valor resuelto de checkDatabase y no es un objeto de respuesta.
Este último ha ensombrecido al primero, por lo que ya no puede acceder a él.
Use nombres únicos para sus variables para evitar este problema.
Recomiendo usar un linter. ESLint puede detectar este tipo de problema con la regla de no sombra .
datdabaseRes y res deben tener un nombre de variable diferente. De lo contrario, res tiene el objeto de respuesta de la conexión de la base de datos en el ámbito en el que intenta usarlo.
router.get('/r/:shortUrl', function(req, res) { connectDatabase.then( checkDatabase(req.params.shortUrl) .then( datdabaseRes => { console.log('checkdatdabase res => ' + datdabaseRes); //res = 'https://www.google.com' res.redirect(datdabaseRes); //TypeError: res.redirect is not a function }) .catch(e => { //executed due to above error console.error(e); res.redirect(307, '/home'); }) ) });