Cómo hacer que ExpressJs soporte solicitud por lotes como Facebook

Tengo un conjunto de rutas con diferentes métodos. Quiero hacer que el expressjs admita la solicitud por lotes, que es muy similar a Facebook, Facebook Batch Request . ¿Alguien sabe cómo hacerlo? Y no quiero hacer 3 conexiones de bucle de retorno para manejar la solicitud de lote.

Si no desea realizar conexiones de bucle invertido, la solución más sencilla es llamar manualmente a su servidor con solicitudes falsas.

Tendrás que volver a implementar IncomingMessage . También debe usar Async # map para esperar hasta que se procesen todas las solicitudes.

Aquí está la idea básica:

 // Es probable que tenga más trabajo que hacer para volver a implementar la API básica de http.
 función FakeRequest (solicitud) {
   this.url = '/' + request.relative_url;
   this.method = request.method;
   this.headers = request.headers;
 }

 función FakeResponse () {
   Stream.call (esto);

   this.statusCode = null;
   this.body = '';
 }

 FakeResponse.prototype.write = function (chunk) {
   this.body + = chunk.toString ('utf8');

   devuelve verdadero
 };

 util.inherits (FakeResponse, Stream);

 app.post ('/', function (req, res) {
   las solicitudes de var = JSON.parse (req.body.batch);

   async.map (solicitudes, función (solicitud, hecho) {
     var fakeReq = new FakeRequest (solicitud),
         fakeRes = new FakeResponse ();

     // llamar al middleware Express 'manualmente
     aplicación (fakeReq, fakeRes);

     // esto se activará cuando la respuesta esté lista.
     fakeRes.once ('end', function () {
       // No filtres a los oyentes
       fakeRes.removeAllListeners ();
       hecho (null, fakeRes);
     });

     fakeRes.once ('error', función (err) {
       fakeRes.removeAllListeners ();
       hecho (err)
     });
   }, función (err, respuestas) {
     si
       return res.send (err);

     res.send (respuestas);
   });
 });

 http.createServer (app) .listen (app.get ('puerto'), function () {
   console.log ('Servidor Express escuchando en el puerto' + app.get ('puerto'));
 });

ACTUALIZAR

En realidad no estoy seguro de lo que quieres decir con loopback, pero tienes 2 opciones:

  • Abra una conexión HTTP para cada solicitud en el lote, que es más fácil de implementar pero más lento.

  • La solución que describí anteriormente: llame al middleware Express directamente sin abrir las solicitudes HTTP.

Tenía la impresión de que no querías la primera solución. Sin embargo, eso es lo que intentaría primero, incluso si es más lento:

  • Es más fácil distribuir las conexiones por lotes en varias instancias cuando escala.
  • No omitirá ningún mecanismo de limitación de carga que pueda tener (que impide que una sola instancia de Express procese demasiadas solicitudes simultáneamente).

Asegúrese de deshabilitar el Agente HTTP sin embargo.