Creé un archivo de enrutador usando Express. Las funciones de devolución de llamada residen en sus archivos "controladores" discretos. El siguiente es un extracto de las partes relevantes para mi pregunta, y se han omitido líneas como require of controller functions:
const express = require('express'); const router = express.Router(); // This should run first router.param('coolParamName', validateParamBeforeHandlingReqs); // Param name is ↑↑↑↑↑ "consumed" here, although NOT defined yet // This should run after the above code router.route('/').get(getAllUserNames).post(createUser); router.route('/:coolParamName').get(getUserName).patch(updateUser).delete(deleteUser); // Param name is ↑↑↑↑↑ defined here, and was consumed earlier - how? Como explican los comentarios, parece que el nombre del parámetro se ha definido como coolParamName en la parte inferior , pero "consumido" por el código escrito arriba . Esto me parece extraño, porque siento que es natural definir primero y luego usar después, ¿soy solo yo? ¿Escribí un código que va en contra del patrón de diseño previsto?
Me gustaría entender cómo Express define el nombre de param y cómo router.param y router.router .
router.param('coolParamName') esencialmente registra una devolución de llamada que será llamada para cualquier ruta (en ese enrutador) que use el parámetro :coolParamName y coincida con la solicitud actual. La devolución de llamada se llamará una vez por solicitud ANTES de la ruta que coincide con la solicitud que contiene el parámetro :coolParamName .
Es una especie de middleware para un parámetro coincidente. Le permite configurar automáticamente algún código de configuración cada vez que ese parámetro en particular coincida en una ruta.
Podría lograr lo mismo simplemente usando una pieza de middleware en esa ruta específica también o simplemente llamando a una función dentro del controlador de ruta. Por lo tanto, esta es solo una característica sutil si usa el mismo parámetro en varias rutas.