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 :

[Express + MySQL] Comment retourner au client les résultats d'une requête


Sujet :

NodeJS

  1. #1
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut [Express + MySQL] Comment retourner au client les résultats d'une requête
    Bonsoir,

    Je fais un petit projet de serveur pour un API Web.

    Le serveur écoute sur un port les requêtes POST, en extrait des paramètres et exécute une requête SQL en fonction.
    Ensuite, il est censé renvoyé les résultats sous forme de json au client.

    Cela donne à peu près ceci :

    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
    router.route('/nearest')
        .post(function(req, res) {
            // Récupération des paramètres dans la requête http
     
            var station = req.body.station;
            var lattitude = req.body.lattitude;
            var longitude = req.body.longitude;
     
            // ... Vérification des paramètres
     
            connection.query(maRequete, [station, lattitude, longitude, function (err, rows) {
                if (err) throw err;
     
                var premier = rows[0];
     
                // Bon là je me doute bien que ça marche pas, puisque res n'est pas accessible dans
                // ce callback
                res.json({
                    resultat: premier
                });
            });
        });
    J'ai bien vu où est le problème mais comme toujours je ne sais jamais comment gérer la portée des variables dans une cascade de callback.
    Je n'ai aucune idée de comment structurer mon code pour faire ce que je veux.
    J'ai bien essayé avec un pool de connexion mais j'ai rien obtenu de concluant.

    Merci beaucoup

  2. #2
    Membre expérimenté
    Avatar de Gnuum
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2007
    Messages : 215
    Points : 1 715
    Points
    1 715
    Billets dans le blog
    1
    Par défaut
    Si, la variable res est visible car elle est dans ton scope de closure.
    Tu ne nous donnes aucune erreur donc nous ne pouvons pas t'aider.

    Cependant, le code que tu nous a donné a une erreur de syntaxe; il manque une accolade après longitude:
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    connection.query(maRequete,[station, lattitude, longitude],function(err, rows){
    {gnu: ["um", "cki"]}

  3. #3
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    Salut gnuum,

    Désolé pour la réponse tardive, je suis une formation de dev à l'afpa et mine de rien on chôme pas ^^. J'ai pas eu trop le temps de bosser sur des petits projets annexes ces derniers temps.

    Effectivement, autant pour moi je n'avais pas vu la faute.

    Je vais essayé ça, je te tiens au courant.

    Bonne soirée

  4. #4
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    Bonsoir,

    Je reviens sur ce message car je ne parviens toujours pas à renvoyer des données en JSON avec mon API.

    Voici mon code :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    /**
     * Identifiants MySQL
     */
    const __hostname__ = "localhost";
    const __username__ = "user";
    const __password__ = "********";
    const __database__ = "base_radio";
     
    // Dépendances aux paquets externes
    var express    = require('express');        
    var mysql      = require('mysql');
    var bodyParser = require('body-parser');
     
    var app        = express(); 
    var connection      = mysql.createConnection({
        host     : __hostname__,
        user     : __username__,
        password : __password__,
        database : __database__
    });
     
    /**
     * Configuration du bodyParser pour pouvoir traiter 
     * les requêtes en POST
     */
    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(bodyParser.json());
     
    /**
     * Définition des routes
     */
    var router = express.Router();         
     
    // Route par défaut
    router.get('/', function(req, res) {
        res.json({ 
            message: 'Bienvenue sur l\'API des stations radios. Voici la documentation :',
            url: 'http://xxx.app/station-radio/documentation'
        });   
    });
     
    // Route : station la plus proche
    router.route('/nearest')
        .post(function(req, res) {
            var station = req.body.station;
            var lattitude = req.body.lattitude;
            var longitude = req.body.longitude;
     
            // Contrôle des erreurs ...
     
            connection.connect();
            connection.query("select freqProche(?, ?, ?);", [station, lattitude, longitude], function (err, rows) {
                if (err) throw err;
                res.json(rows);
            });
            connection.end();
        });
     
     
    app.use('/api', router);
     
    // Démarrage du serveur
    app.listen(port);
     
    console.log('Serveur en écoute sur le port ' + port);
    Je recherche simplement à répondre à la requête HTTP contenant du Json par le résultat de la requête MySQL.

    J'utilise Postman pour les tests. J'arrive bien à récupérer et à vérifier mes paramètres latitude, longitude et station.

    Mais dès que j'exécute la requête MySQL je n'ai aucune réponse et finalement je dépasse le timeout pour la requête HTTP.

    Il y a un truc tout con que je loupe c'est sûr. D'après moi je n'ai pas accès à res (objet Response d'express) dans le scope du callback de connection.query(). Mais comment faire pour répondre au client une fois les résultats de la DB obtenu ?

    Si quelqu'un a une idée, en vous remerciant d'avance.

    Bonne soirée.

  5. #5
    Membre expérimenté
    Avatar de Gnuum
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2007
    Messages : 215
    Points : 1 715
    Points
    1 715
    Billets dans le blog
    1
    Par défaut
    Avant de poser la question, tu dois chercher par toi-même pour 2 raisons:

    • ne pas dépendre toujours des autres pour résoudre un problème
    • pouvoir nous donner un maximum d'informations au cas où tu n'y arrives vraiment pas



    En l'occurrence, est-ce que l'on passe bien dans la fonction du post (j'ai cru comprendre que oui mais ce n'est pas très clair)? Est-ce que tu passes dans le callback de ta query? Si oui, est-ce que tu as une erreur ou un résultat dans rows?

    D'après moi je n'ai pas accès à res (objet Response d'express) dans le scope du callback de connection.query()
    Qu'est-ce qui te fait penser ça? Qu'as-tu fais pour essayer de vérifier cette hypothèse? A priori tu as un scope de closure qui te permet tout à fait d'avoir accès à cette variable.
    {gnu: ["um", "cki"]}

Discussions similaires

  1. [MySQL] Classer les résultats d'une requête mysql
    Par patriciaprovence dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 30/04/2010, 23h15
  2. Réponses: 2
    Dernier message: 30/07/2009, 14h26
  3. Comment formater les résultats d'une requête sql
    Par hjulius dans le forum PL/SQL
    Réponses: 1
    Dernier message: 28/07/2009, 17h23
  4. Réponses: 5
    Dernier message: 15/10/2008, 09h08
  5. [SQL] Comment je peux mettre les résultat d'une requete dans un fichier
    Par Maria1505 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 10/12/2006, 21h44

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