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 functionTengo 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?
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'); } };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.
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.