const cb0 = function (data, req, res, next) { console.log('CB0') next() } const cb1 = function (data, req, res, next) { console.log('CB1') next() } app.get('/example/d', [cb0, cb1], (req, res, next) => { console.log('the response will be sent by the next function ...') next() }, (req, res) => { res.send('Hello from D!') }) Desde el código anterior, paso una serie de funciones [cb0, cb1] y cada función requiere algún atributo de data de tipo any y parámetros adicionales como req , res y next .
Anteriormente, intenté pasar el atributo de datos como el siguiente formato usando el concepto de bind . app.get('/example/d', [cb0.bind(data), cb1.bind(data)], (req, res, next)
Pero si uso el concepto de bind , ¿cómo pasar los otros atributos requeridos ( req , res y next )? ¿Hay alguna otra forma de pasar todos los parámetros, incluidos data sin enlace? o tenemos alguna limitación en el uso de la matriz de funciones en el expreso?
Primero, usó bind incorrectamente (por cómo se escriben sus funciones): el primer argumento para enlazar es el valor que se usará como this al llamar a la función; son solo los argumentos posteriores los que definen los argumentos para dar la función cuando se llama. Entonces querrás cb0.bind(null, data) en lugar de cb0.bind(data) .
Pero si uso el concepto de
bind, ¿cómo pasar los otros atributos requeridos (req,resynext)?
(Son argumentos, no atributos). Express hace eso cuando llama a su función. Los argumentos seguirán los argumentos que ha "incrustado" en sus funciones a través de bind . Sus funciones ya están configuradas correctamente para manejar ese pedido ( data , req , res , next ), por lo que con el cambio, debería estar listo para comenzar.
Asi que:
app.get('/example/d', [cb0.bind(null, data), cb1.bind(null, data)], (req, res, next) => { // ... Solo para mayor claridad, aquí hay un ejemplo de una función con datos vinculados a través de bind que se llama con más argumentos:
function example(data, other) { console.log(`data = ${JSON.stringify(data)}, other = ${JSON.stringify(other)}`); } const ex = example.bind(null, "baked in arg"); // Emulating Express calling the middleware: ex("passed arg");Nota al margen: no tiene que poner sus funciones de middleware en una matriz, express está feliz con ellas como argumentos discretos en su lugar:
app.get('/example/d', cb0.bind(null, data), cb1.bind(null, data), (req, res, next) => { // ...De cualquier manera está bien.