Recientemente me encontré con este código y no entiendo por qué se ha omitido el next de la función de protect (dentro de la función de protección y protectandauth ) mientras que originalmente se incluyó en la función de protect . Quiero saber la diferencia entre protect=async(req,res,next) y protect=async(req,res,()=>{} .
También veo que aunque next se omite en la función protect (la que está dentro de protectandauth ), todavía se usa en el código después de la declaración 'if', ¿cómo es eso posible?
Código:
export const protect = async (req, res, next) => { if ( req.headers.authorization && req.headers.authorization.startsWith("Bearer") ) { let token; token = req.headers.authorization.split(" ")[1]; const decoded = jwt.verify(token, "kris"); req.userId = decoded.id; try { req.user = await User.findById(req.userId).select("-password"); next(); } catch (error) { res.status(401).json(error.message); } if (!token) { res.status(404).json("no token found"); } } }; export const protectandauth = async (req, res, next) => { protect(req, res, () => { if (req.userId == req.params.id) { next(); } else { res.status(401).json("not authorised"); } }); };Cada devolución de llamada en la que accede a req y res , también puede acceder a next . next es una función que se usa para decir "pasar a la próxima devolución de llamada", sabiendo que una solicitud puede ser procesada por múltiples devoluciones de llamada, así:
const firstCallback= (req, res, next) => {} const secondCallback= (req, res, next) => {} app.get("/", firstCallback); app.get("/", secondCallback); // or using this syntax app.get("/", firstCallback, secondCallback); En el ejemplo anterior, cuando llega una solicitud a / , firstCallback la maneja primero y es uno de los dos escenarios a continuación (de lo contrario, la solicitud se bloqueará y el usuario no obtendrá una respuesta):
res , como res.status(401).json("not authorised");next() , y luego secondCallback lo maneja. Si se omite next de los parámetros, llamará a next() donde no está undefined y eso genera un error. Hablando del uso de la función de protect , si observa, existe next como parte de los parámetros de protectandauth , y es ese next el que se usa dentro del tercer parámetro de protect , que es:
() => { if (req.userId == req.params.id) { next(); } else { res.status(401).json("not authorised"); } } Y en este código específico que tiene, la función anterior se pasa como next en la definición de protect .
Usamos next si queremos pasar nuestra solicitud al siguiente middleware en línea. Tal vez en protect, el programador podría no querer pasar el requerimiento al siguiente middleware pero en protectandauth quiere pasar el req al siguiente middleware si esta condición resulta ser cierta
if (req.userId == req.params.id) { next(); }