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

177
Vistas
TypeError: .then no es una función

Tengo un error cuando el usuario no es administrador, no muestra mi mensaje "No autorizado para acceder a esta página" porque en su lugar aparece este error en la consola:

 TypeError: productController.createProduct(...).then is not a function

Tengo un router configurado así:

 router.post('/create',auth.verify, (req, res)=>{ const isAdmin = auth.decode(req.headers.authorization).isAdmin; productController.createProduct(req.body,isAdmin).then(result => res.send(result));})

Y mi controlador:

 module.exports.createProduct = (reqBody, isAdmin) => { if (isAdmin === true) { let newProduct = new Product({ name: reqBody.name, description: reqBody.description, price: reqBody.price, }); return newProduct.save().then((result, error) => { return error ? false : 'Successfully created a product'; }); } else { return 'Not authorized to access this page'; } };

Sin embargo, todo funciona bien cuando el usuario es un administrador. Me pregunto si esto tiene algo que ver con la forma en que devuelvo mi mensaje cuando el usuario no es administrador. ¿Porque estoy usando promesas?

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Debe devolver una promesa tanto en casos de éxito como de error:

 module.exports.createProduct = (reqBody, isAdmin) => { if (isAdmin === true) { let newProduct = new Product({ name: reqBody.name, description: reqBody.description, price: reqBody.price, }); return newProduct.save().then((result, error) => { return error ? false : 'Successfully created a product'; }); } else { // Return a promise here return Promise.reject('Not authorized to access this page'); } };
about 4 years ago · Juan Pablo Isaza Denunciar

0

Hay esencialmente dos formas de abordar este problema.

En la primera forma, puede abordar el diseño general de su API y hacer que el código sea más efectivo.

Por ejemplo, si su operación es exitosa debido al hecho de que el user es admin o no, puede responder con Promise.reject o Promise.resolve. Pero, si está devolviendo un Promise.reject desde la función createProduct , también debe actualizar la forma en que maneja el rechazo en el controlador.

Por ejemplo:

crearProducto.js

 module.exports.createProduct = (reqBody, isAdmin) => { if (isAdmin === true) { let newProduct = new Product({ name: reqBody.name, description: reqBody.description, price: reqBody.price, }); return newProduct.save().then((result, error) => { return error ? false : 'Successfully created a product'; }); } else { // Return a promise here return Promise.reject('Not authorized to access this page'); } };

controlador.js

 router.post('/create',auth.verify, (req, res)=>{ const isAdmin = auth.decode(req.headers.authorization).isAdmin; productController.createProduct(req.body,isAdmin) .then(result => res.send(result)) .catch(error => res.send(error)); // catch will be executed due to Promise.reject })

O, en la segunda forma, puede simplemente devolver una Promise.resolve desde el bloque else de la función createProduct.

Ejemplo:

return Promise.resolve("Not authorized to access this page")

Y en este caso, no necesita actualizar el código de su controlador.

Recomendaría seguir la forma .then .catch de hacer las cosas para detectar cualquier error que pueda enfrentar con la parte de creación del Producto. Facilita el seguimiento de errores.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Tiene razón en que no funcionará si el usuario no es un administrador y que debe devolver una promesa. La solución más simple es cambiar la instrucción else por la siguiente.

 else{ return Promise.resolve("Not authorized to access this page") }

También puede devolver Promise.reject(new Error("Not authorized to access this page")) que obligaría a cualquier cosa que consuma esta función a manejar un error para este escenario. Eso podría encajar con su diseño, podría no.

about 4 years ago · Juan Pablo Isaza 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