Nodejs, expressjs – comment proposer une réponse différée

Je construis un service Web pour lequel j’utilise des nœuds, des phantomjs et des expressjs. J’apprends tous les trois.

Je souhaite envoyer une réponse différée aux clients après le traitement de leur requête. Comme par exemple,

Je suis en train de traiter certaines entrées de mon client, alors, je veux traiter les données sur le backend, ce qui prendra environ 10 secondes sur une moyenne. Ensuite, je voulais servir cette page au client.

Est-il possible dans le nœud d’envoyer plusieurs réponses à la même demande ou des réponses différées afin que le modèle mette automatiquement à jour le contenu.

Ou, devrais-je utiliser la même méthode, comme stocker le json dans un fichier sur le serveur, puis servir la page avec ajax qui interrogera la page.

Aidez-moi, s’il vous plaît. voici le code que j’ai écrit,

app-server.js (le fichier principal):

// import express module var express = require('express'); var bodyParser = require('body-parser'); var app = express(); // define all required template files to be served and also define the template engine app.engine('.html', require('ejs').__express); app.set('views', __dirname + '/views'); app.set('view engine', 'html'); // Useful modules app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: true})); // import the routes require('./router')(app); app.listen(8080); 

routeur.js:

 var crypto = require('crypto'); var express = require('express'); module.exports = function (app) { // define the static routes. app.use('/static', express.static('./static')); app.use('/media', express.static('./media')); //defining the controller. var parserlib = require('./controller.js') // Define the home root path app.get('/', function (req, res) { // shows the home search page. res.render('index', {content:'template success'}); }); app.get('/search', function(req, res){ res.redirect('/'); }); app.post('/search', parserlib.parserlib); } 

controller.js:

 var crypto = require('crypto'); var path = require('path') var childProcess = require('child_process') exports.parserlib= function(req, res){ var output = ''; var url = req.body.search_url; var childArgs = [ path.join(__dirname, 'external-script.js'), url, ] // execute the script in a separate thread. childProcess.execFile(binPath, childArgs, function(err, stdout, stderr) { // handle results console.log(stdout); output = stdout; //console.log(err); //res.send(output); }); //res.send(output); }; 

Donc, ce que je veux voir, c’est d’abord envoyer une réponse au client en lui indiquant que son chargement, puis je veux mettre à jour le avec les données traitées. Dans d’autres langues, il n’est pas possible d’envoyer plusieurs réponses. Pas sûr de nodejs.

Aussi, dois-je stocker la sortie JSON de la lib traitée dans un fichier, puis utiliser ajax pour interroger? ou est-il possible de mettre à jour directement l’object json au client?

Merci

Ce n’est tout simplement pas comment HTTP fonctionne. Les clients ne s’y attendent pas. Cela n’a rien à voir avec Node ou tout autre framework. La meilleure façon de faire ce que vous essayez est d’envoyer une réponse indiquant que le chargement est en cours, puis d’avoir un autre mécanisme pour signaler l’état.

Par exemple, vous pouvez concevoir une API RESTful. Dans cette API RESTful, vous pouvez définir un sharepoint terminaison pour la création de nouveaux éléments:

POST / api / choses

Le client posterait des données pour créer une nouvelle chose. La réponse doit être quelque chose qui fournit un emplacement de la ressource nouvellement créée, par exemple un HTTP 301 à /api/things/1 .

Si l’utilisateur accède à /api/things/1 et que la tâche n’est pas encore terminée, vous pouvez soit effectuer une redirection temporaire (303) vers /api/things/1/status qui fournit des informations utiles sur l’état, ou il suffit d’émettre un 404.

Si vous souhaitez réellement renvoyer des informations d’état côté serveur, consultez plutôt WebSockets ou une API de socket pure, qui n’est ni fournie par Express, mais qui sont disponibles dans Node (consultez la bibliothèque socket.io et la bibliothèque de base)