2016-03-24 9 views
1

Aktuelle Post Anfrage:Wie schalte ich die Post-Anfrage in Node.js?

app.post('/rImage', rawBody, function (req, res) { 
// ---- check here, if this process is running ? ---- 
    var data = req.rawBody; 
    var escapedData = data.replace(/([<>|&^])/g, "\^$1"); // Windows CMD escaping 
    exec('cscript /nologo C:/PS/Automation/render.vbs C:/PS/Automation/image.jsx"'+escapedData + '"', 
    function (error, stdout, stderr) { 
     console.log('stdout: ' + escapedData); 

     if(error !== null) { 
     console.log('exec error: ' + error); 
     } 
     res.send(stdout); 
     //request finished 
    }); 
}); 

Wie könnte ich ein Warteschlangen-System implementieren diese, so dass die nächste Anfrage aus feuert, wenn der letzte fertig ist?

Danke in adnvance!

Antwort

2

Möglicherweise gibt es dafür Bibliotheken. Allerdings könnte man es so hacken:

var queue = []; 
var active = false; 
var check = function() { 
    if (!active && queue.length > 0) { 
     var f = queue.shift(); 
     f(); 
    } 
} 

app.post("..", body, function(req, res) { 
    queue.push(function() { 
     active = true; 

     exec("yourprogram arg1 arg2..", function() { 
      // this is the async callback 
      active = false; 
      check(); 
     }); 
    }); 
    check(); 
}); 

Hier ist eine Geige, die die Funktionalität zeigt: https://jsfiddle.net/fc15afw5/1/

+0

+1 für eine „Arme-Leute-Warteschlange“. Versuchen Sie für Bibliotheken [async] (https://github.com/caolan/async#queue). Sie könnten auch etwas Infrastruktur-basiertes tun, wie [RabbitMQ] (https://www.rabbitmq.com/) –

+0

Die Async-Bibliothek sieht sehr interessant aus, wusste das vorher nicht. Aber wenn es zu einer direkten Implementierung kommen würde, was würden Sie im obigen Code verbessern? - um es ein bisschen reicher an die Reihe eines reichen Mannes zu machen ;-) –

+0

1 Hängt davon ab, was wir machen, warum wir es in die Warteschlange stellen, ob wir es vergrößern müssen, usw. :) Schau es dir nochmal an scheint, dass wir ein VBScript ausführen? In diesem Fall glaube ich nicht, dass ich etwas ändern würde, da es so aussieht, als wollten wir nur sicherstellen, dass das Skript nur einzeln ausgeführt wird (ich nehme an, weil das VBScript bricht, wenn es gleichzeitig ausgeführt wird). Wenn wir Flexibilität bei der Anzahl der gleichzeitigen Läufe wünschen, könnte ich nach async.queue greifen. Wenn es sich um eine langsame Verarbeitung handelt, könnten wir auf einen anderen Server wechseln. Ich könnte RabbitMQ verwenden. –

Verwandte Themen