2015-09-10 3 views
3

J'étudie un peu la programmation de node.js ici et j'ai rencontré un problème.node.js et express: comment attendre la réponse udp

Lorsqu'express reçoit une requête POST, il doit effectuer une authentification radiale sur UDP avec le module dgram. La réponse pour l'authentification Radius est ultérieure, mais le rappel de demande POST a déjà quitté et les variables req et res sont perdues et la réponse utilisant la même connexion TCP ne peut pas être effectuée.

Si je devrais attendre la réponse de rayon (qui est assez rapide) comment dois-je faire l'attente dans le noeud.js & express?

Le code ci-dessous effectue la transmission de base du POST et l'authentification du rayon.

Merci beaucoup pour vos conseils.

 

    var http = require('http'); 
    var express = require('express'); 
    var bodyParser = require('body-parser'); 
    var radius = require('radius'); 
    var dgram = require('dgram'); 

    var radius_secret = 'really_secret'; 
    var radius_server = '127.0.0.1'; 
    var radius_port = '1812'; 

    function handleAuthentication(req, res) { 
     console.log("BODY:",req.body); 
     var client = dgram.createSocket("udp4"); 
     var account = req.body.account; 
     var password = req.body.password; 
     var packet = { 
      code: 'Access-Request', 
      secret: radius_secret, 
      identifier: 0, 
      attributes: [ 
       ['NAS-IP-Address', radius_server], 
       ['User-Name', account + "@exampledomain.something"], 
       ['User-Password', password] 
      ] 
     }; 

     client.on('error', function(e) { 
       throw e; 
      }); 

     client.on('message', function(msg, rinfo) { 
      var radius_response = radius.decode({packet: msg, secret: radius_secret}); 
      console.log(radius_response); 
     }); 

     var encoded = radius.encode(packet); 
     client.send(encoded, 0, encoded.length, radius_port, radius_server); 
    } 

    var app = express(); 
    app.use(bodyParser.json()); 
    app.use(bodyParser.urlencoded({ extended: false})); 

    app.post('/authenticate', function(req, res) { 
     // Authenticate against radius server 
     handleAuthentication(req, res); 

     // The radius response is not received yet, and we will exit the post request 
     // here and loose the req and res. 
    }); 

    var server = http.createServer(app); 
    server.listen(80); 

Répondre

3

Vous devez répondre dans les rappels client. Ainsi, par exemple, pour répondre après le message:

client.on('message', function(msg, rinfo) { 
    var radius_response = radius.decode({packet: msg, secret: radius_secret}); 
    console.log(radius_response); 
    res.send('somethingCalculatedWithUDPResponse'); 
}); 

Et vous devez le gérer de la même dans le rappel error.

res et req ne «meurent» pas lorsque la fonction se termine, ils peuvent toujours être référencés par les fermetures passées en tant que rappels.