IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NodeJS Discussion :

Gestion des retours avec l'asynchrone


Sujet :

NodeJS

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2014
    Messages : 14
    Par défaut Gestion des retours avec l'asynchrone
    Bonjour à tous !

    Je viens vous demander de l'aide quant à la conception de mon projet nodejs. Je suis nouveau dans le monde de la programmation web et je découvre tout juste nodejs.

    Je suis en train de coder une api web mais je rencontre un problème que je ne sais pas résoudre :/ ... Pour l'instant mon api est vraiment simple. J'ai une route getRequest à laquelle on donne un token. La première tâche que je souhaite faire est vérifier ce token.

    Voici mes fichier pour que vous compreniez un peu mieux :

    app.js
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var getRequest = require('./getRequest');
    var argumentChecker = require('./argumentChecker')
    var express = require('express');
    var app = express();
     
    app.get('/getRequest', [getRequest.checkGetRequest, getRequest.getRequestError, getRequest.getRequest]);
     
    app.use(function(req, res) {
    	res.status(404).send('Not found');
    });
     
    app.listen(4242);
    Ici pour la route /getRequest j'utilise 3 middleware, checkGetRequest qui vérifie le fond et la forme de la requete, getRequestError en cas d'erreur et enfin getRequest pour répondre à la requete.

    getRequest.js
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    var argumentChecker = require('./argumentChecker');
    var constantes = require('./constantes');
     
    module.exports = {
     
    	// Permet de valider le fond et la forme de la requete
    	checkGetRequest: function(req, res, next) {
     
    		req.apiError = argumentChecker.checkApiToken(req, res);	
    		next();
    	},
     
    	// En cas d'erreur on renvoie une réponse d'erreur ici, sinon on passe à travers
    	getRequestError: function(req, res, next) {
     
    		console.log('res : ' + req.apiError);
    		if (req.apiError === constantes.noError())
    			next();
     
    		res.json('{ "status": "error", "reason": "' + req.apiError + '" }');			
    	},
     
    	// Permet de répondre à la requete
    	getRequest: function(req, res, next) {
    		res.json('{ "status": "success", "author": "alexis", "age": 42 }');
    	}
    };
    Mon problème commence ici, dans checkGetRequest j'appelle la fonction argumentChecker.checkApiToken pour valider mon token ... J'ai créée une fonction à part car je vais sans doute réutiliser cette fonctionnalité dans d'autres cas. Cette fonction est censé me renvoyer un code d'erreur si le token n'est pas bon.

    Voici le fichier où se trouve cette fonction : argumentChecker.js
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    var constantes = require('./constantes');
    var bdd = require('./bdd').bdd;
     
    module.exports = {
     
    	// Permet de vérifier la forme et l'existance du token
    	checkApiToken: function(token) {
     
    		if (token === undefined || token === "")
    			return (constantes.tokenIsMissing());
     
    		bdd.getConnection(function(err, connection) {
    			if (err)
    				console.log(err);
     
    			connection.query('SELECT api_state FROM api_infos WHERE api_token = ' + bdd.escape(token),
    			function(err, rows, fields) {
    				if (err)
    					console.log(err);
    				if (fields < 1)
    					return(constantes.tokenIsUnknown());
    				if (rows[0].api_state == 0)
    					return (constantes.tokenIsDesactivated());
    			});
     
    			connection.release(); // <-------------- le faire à chaque fois qu'on fait un if qui return !
    		});
     
    		return (constantes.noError());
    	}
    };
    C'est la le coeur du problème .... Je commence par faire une vérification de base, savoir si le token existe et si il n'est pas vide. Ensuite je veux vérifier que ce token est bien en base de données, pour ca j'utilise une connection à ma base de données mysql grace a bdd.getConnection. Je rentre donc dans un callback ... Ensuite j'exécute ma requete, je récupère ma réponse dans une second callback ... Avec les éléments de réponse je fais mes tests. Evidement si ce n'est pas bon je fais un return, et ca marche pas. Je comprend que ca ne marche pas, un callback n'est pas censé faire de return. Mais je ne sais pas comment m'y prendre autrement ! Avec vous une idée ?

    Merci !

    EDIT:
    J'ai essayé une autre approche, utiliser la fonction checkApiToken comme un middleware, pour ca je l'ai changer comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oldcheckApiToken: function(req, res, next)
    et dans app.js j'ai changer cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    app.get('/getRequest', [argumentChecker.checkApiToken, getRequest.getRequestError, getRequest.getRequest]);
    Dans les conditions if de checkApiToken j'ai fais quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (field< 1) {
        req.apiError = constantes.tokenIsUnknown();
        next();
    }
    Mais ça ne fonctionne toujours pas, chose étrange car je pensais que ça réglerai mon problème !

  2. #2
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2016
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 225
    Par défaut
    Bonjour,

    tu dois simplement prendre un callback en paramètre de argumentChecker.checkApiToken.

    Ainsi donc dans argumentChecker.checkApiToken tu pourras faire un ou plusieurs processus asynchrone, lorsque tu auras finis, tu pourras invoqué le callback reçu en paramètre et lui envoyé le résultat de la logique.

    A noter, et c'est très important, les callbacks doivent toujours exposer un paramètre err en premier, même si tu ne t'en sers pas.

    Au passage dans ton bdd.getConn, quand tu attrapes un erreur, je pense que tu devrais faire un return pour ne pas exécuter la requête sql.

Discussions similaires

  1. [FLASH 8] [XML] Problème avec XML.load() asynchrone
    Par SSJ17Vegeta dans le forum Flash
    Réponses: 1
    Dernier message: 20/01/2006, 18h47
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo