javascript node.js next ()


148

Veo mucho uso nexten node.js.

¿Qué es, de dónde viene? ¿Qué hace? ¿Puedo usarlo del lado del cliente?

Lo sentimos, por ejemplo, se usa aquí: http://dailyjs.com/2010/12/06/node-tutorial-5/

busque la función loadUser.


No he visto esto en ninguna parte, y no se menciona en ninguna parte de la documentación. ¿Estás seguro de que no está definido en algún lugar de la base de código que estás viendo?
— Samir Talwar

Eso es demasiado vago. ¿Puedes dar un ejemplo de contexto?
— Raynos

Respuestas:


114

Esto parece ser una convención de nomenclatura variable en el código de flujo de control de Node.js, donde se da una referencia a la siguiente función a ejecutar a una devolución de llamada para que se inicie cuando se hace.

Vea, por ejemplo, los ejemplos de código aquí:

Veamos el ejemplo que publicaste:

function loadUser(req, res, next) {
  if (req.session.user_id) {
    User.findById(req.session.user_id, function(user) {
      if (user) {
        req.currentUser = user;
        return next();
      } else {
        res.redirect('/sessions/new');
      }
    });
  } else {
    res.redirect('/sessions/new');
  }
}

app.get('/documents.:format?', loadUser, function(req, res) {
  // ...
});

La loadUserfunción espera una función en su tercer argumento, que está vinculado al nombre next. Este es un parámetro de función normal. Contiene una referencia a la siguiente acción a realizar y se llama una vez que loadUserse realiza (a menos que no se pueda encontrar un usuario).

No hay nada especial sobre el nombre nexten este ejemplo; podríamos haberle dado cualquier nombre.


Esto también se usa bastante en express.js pero no lo es .next(). Parece preguntar sobre nextcomo un método en un objeto.
— Raynos

1
Mejor usarreturn next();
— Ryan Walton

2
@RyanWalton Estoy de acuerdo
— Wayne

Solía ​​en return callback()lugar dereturn next()
— vijay

39

Es una convención de nomenclatura utilizada al pasar devoluciones de llamada en situaciones que requieren la ejecución en serie de acciones, por ejemplo, escanear directorio -> leer datos de archivo -> hacer algo con datos. Esto es preferible a anidar profundamente las devoluciones de llamada. Las primeras tres secciones del siguiente artículo en el blog HowToNode de Tim Caswell dan una buena descripción de esto:

http://howtonode.org/control-flow

Consulte también la sección Acciones secuenciales de la segunda parte de esa publicación:

http://howtonode.org/control-flow-part-ii


1
Muchas gracias por estos enlaces. Explica muchas cosas cuando empiezas a trabajar con nodejs
— Hassam Abdelillah

El enlace no funciona ahora. Está dando un error interno del servidor
— Deep Kakkar

1
Enlaces actualizados del archivo de Internet
— Pero P.

gracias por los enlaces, comencé a usar Node hace unos meses pero me encuentro usando estas prácticas pero no las entiendo completamente
— Charles Smith

8

Básicamente es como una devolución de llamada que express.js usa después de que se ejecuta y se hace una cierta parte del código, puede usarlo para asegurarse de que se haga parte del código y de lo que desea hacer, pero siempre tenga en cuenta que solo puede haz uno res.senden cada bloque REST ...

Entonces puedes hacer algo como esto como un simple next()ejemplo:

app.get("/", (req, res, next) => {
  console.log("req:", req, "res:", res);
  res.send(["data": "whatever"]);
  next();
},(req, res) =>
  console.log("it's all done!");
);

También es muy útil cuando desea tener un middleware en su aplicación ...

Para cargar la función de middleware, llame a app.use (), especificando la función de middleware. Por ejemplo, el siguiente código carga la función de middleware myLogger antes de la ruta a la ruta raíz (/).

var express = require('express');
var app = express();

var myLogger = function (req, res, next) {
  console.log('LOGGED');
  next();
}

app.use(myLogger);

app.get('/', function (req, res) {
  res.send('Hello World!');
})

app.listen(3000);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.