2017-05-23 3 views
0

Ich bin schwer zu verstehen, wie asynchrone Programmierung zu verwenden. Ich habe einen TCP-Server, der auf Verbindungen wartet, Pakete annimmt und dann die enthaltenen Daten an ein Modul weiterleitet, das Schlüsselpaare generiert und das ganze Chaos in PostgreSQL speichert. Ich muss den öffentlichen Schlüssel an den TCP-Server zurückgeben, um ihn an den Absender des ursprünglichen Pakets zurückzugeben. Was ich jetzt habe funktioniert aber ich glaube es hinterlässt den öffentlichen Schlüssel und geht unbestimmt an den Client über. Ich kann nicht entscheiden, ob ich den Prozess, den ich verwende, nicht richtig verstehe oder wenn ich den ganzen Prozess komplett falsch verstehe.Node.js Async-Modul Wert zurück

Hier ist mein Code

Server:

var net = require('net'); 
    var keys = require('./genKey.js'); 

    var HOST = '10.0.0.1'; 
    var PORT = 5555; 

    net.createServer(function(sock) { 

     console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort); 

     sock.on('data', function(data) { 

      // console.log('DATA ' + sock.remoteAddress + ': ' + data); 

      keys.genKey(data, out); 

      //var public = console.log(String(keys.pub)); 
      **function out (pk) { 
      console.log('out function called'); 
      var public = keys.pub; 
      sock.write(public);** 
      console.log(public); 
      } 

      //var promise = keys.genKey(data); 
      //promise.then(console.log, console.error); 

      //console.log(public); 

      //sock.write(String(keys.pub)); 

     }); 
     sock.on('error', function (exc) { 
     console.log("ignoring exception: " + exc); 
    }); 

     sock.on('close', function(data) { 
      console.log('CLOSED: ' + sock.remoteAddress +' '+ sock.remotePort); 
     }); 

    }).listen(PORT, HOST); 

    console.log('Server listening on ' + HOST +':'+ PORT); 

Modul:

var Promise = require('promise'); 
    var cp = require('child_process') 
     , assert = require('assert') 
     ; 
    const pool = require('./db'); 

    var prkey = ''; 
    var pukey = ''; 

    var privateKey, publicKey; 
    publicKey = ''; 

    module.exports = { 
    genKey: function(input) { 
    cp.exec('openssl genrsa 2048', function(err, stdout, stderr) { 
     assert.ok(!err); 
     prkey = stdout; 
     privateKey = stdout; 
     //console.log(privateKey); 
     //console.log('stdout: ', stdout); 
     //prkey = privateKey; 
     //console.log(prkey); 
     makepub = cp.spawn('openssl', ['rsa', '-pubout']); 
     makepub.on('exit', function(code) { 
     assert.equal(code, 0); 
     //console.log(publicKey); 
     //pukey = publicKey; 
     //console.log(pukey); 
     }); 
     makepub.stdout.on('data', function(data) { 
     publicKey += data; 
     pukey = String(publicKey); 
     //console.log('stdout: ', publicKey); 
     writeSQL(input, prkey, pukey); 
     //console.log(pukey); 
     //return { 
     //pub:() => pukey 
     // }; 
     **return pukey;** 
     }); 
     makepub.stdout.setEncoding('ascii'); 
     makepub.stdin.write(privateKey); 
     makepub.stdin.end(); 
    //console.log('stdout: ', stdout); 
    }); 

    //console.log('output keys'); 
    //console.log(prkey); 
    //console.log(pukey); 
     //writeSQL(prkey, pukey); 
    } 
    }; 

    function writeSQL(uuid, private, public) { 
     //console.log(private); 
     //console.log(public); 
     //console.log(uuid); 
     console.log('write sql'); 
     //pool.query('INSERT INTO uuidkeys(uuid, public, private) values($1,$2, $3)', 
     // [uuid, public, private]); 

    }; 

ich für den unordentlichen Code entschuldigen, habe ich versucht, so viele verschiedene Dinge, die es sehr hässlich geworden. Wenn mir jemand sagen könnte, wie ich meinen öffentlichen Schlüssel an meinem Server an der richtigen Stelle in meiner Serverfunktion wiederherstellen kann, wäre das großartig. Hoffentlich reicht das aus, um mich auf den richtigen Weg zu bringen, dies zu verstehen.

Antwort

0

Nachdem ich meinen Kopf gegen die Wand geschlagen habe, verstehe ich endlich, wie das funktioniert. Keines der Dokumente und Tutorials, die ich las (Dutzende von ihnen), erklärte dies in einer Weise, die für mich klickte, ich versuchte alles, was mir einfiel und es schließlich funktionierte.

Das fehlende Bit der Info war eine äußerst einfache Erklärung, was ein Callback ist. Ich werde meine Vorstellung davon geben, falls jemand anderes durch dieses Ringen stolpert, wo ich war.

Der Callback ist eine weitere Funktion, die Sie in Ihrem Aufruf der zu verwendenden Funktion angeben, die dann von der Funktion aufgerufen wird, mit der Sie zum ursprünglichen Prozess zurückkehren.

Also von meinem Code oben:

Server

var keys = require('./genKey3.js'); 
var r = new keys(); 

call the function from the module 
r.generate(data, /*pass this function to that function*/ function 
backed(key) 
{ 
     //do this when the backed function is called from the other function 
     console.log('out function called'); 
     console.log(key); 
     sock.write(key); 
     sock.on('close', function(data) { 
      console.log('CLOSED: ' + sock.remoteAddress +' '+ 
     sock.remotePort); 
     }); 
    }); 

Modul

this.generate = function(input, /*get your callback function here*/backed) { 
    var privateKey, publicKey; 
    publicKey = ''; 
    console.log('generate function called'); 
    cp.exec('openssl genrsa 2048', function(err, stdout, stderr) { 
     assert.ok(!err); 
     privateKey = stdout; 
     //console.log(privateKey); 
     makepub = cp.spawn('openssl', ['rsa', '-pubout']); 
     makepub.on('exit', function(code) { 
      assert.equal(code, 0); 
      //console.log(publicKey); 
      writeSQL(input, privateKey, publicKey); 

      //Get your info together and call the function passed from the 
      //starting point to return your data 
      backed(publicKey); 
     }); 
     //console.log('passed makepub.on'); 
     makepub.stdout.on('data', function(data) { 
      publicKey += data; 
     }); 
     makepub.stdout.setEncoding('ascii'); 
     makepub.stdin.write(privateKey); 
     makepub.stdin.end(); 
    }); 
}; 

Es ist eigentlich Kuchen, wenn Sie Ihren Kopf um es zu bekommen, und ich denke, wenn ich über diese Erklärung gelaufen war früher hätte ich 15 Minuten gebraucht, um zu diesem Punkt zu kommen.