2 votes

comment pousser le résultat de chaque élément d'un tableau vers une variable globale en javascript nodejs ?

var container = [];

var number = ['1234567890', '646494964', '4498549646', '46654654664', '546646546']

for (k = 0; k < number.length; k++) {

    var sql1 = "SELECT name,age FROM  `table` WHERE  `mobile_number` LIKE '%" + number[k] + "%'"

    mysql.query(sql1, function(error, result) {
        // I will be getting the result of first element in the array here
        console.log(result);
        container.push(result);
    });
}

J'ai besoin de pousser le résultat de chaque élément du tableau vers la variable du conteneur. J'ai besoin de quelque chose comme.

var container = [{name:"steve",age:"22"},{name:"john",age:"22"},{name:"boss",age:"24"},{name:"jeff",age:"28"},{name:"michael",age:"29"}]

1voto

aSoler Points 130
container.push({name: result.name, age: result.age}));

Je pense que ça peut aider. Mais je vous recommande de faire une seule requête.

"SELECT nom,âge FROM tablemobile_number IN (" + nombre.joint(',') + ")"

1voto

Jaromanda X Points 12007

Comme mentionné dans une autre réponse, la façon la plus performante de procéder est une requête unique, construite en boucle.

var number = ['1234567890', '646494964', '4498549646', '46654654664', '546646546']

var sqlPre = "SELECT name,age FROM  `table` WHERE";
var sqlArray = number.map(item => "`mobile_number` LIKE '%" + item + "%'");
var sql1 = `${sqlPre} ${sqlArray.join(" OR ")}`;
mysql.query(sql1, function(error, result) {
    container = result.map(({name, age}) => ({name, age}));
});

Remarque : ce qui précède fait appel à de nombreux concepts de la version ES2015+. S'ils ne vous sont pas familiers, dans la version ES5, ils seraient les suivants

var number = ['1234567890', '646494964', '4498549646', '46654654664', '546646546'];

var sqlPre = "SELECT name,age FROM  `table` WHERE";
var sqlArray = number.map(function (item) {
    return "`mobile_number` LIKE '%" + item + "%'";
});
var sql1 = sqlPre + ' ' + sqlArray.join(" OR ");
mysql.query(sql1, function (error, result) {
    container = result.map(function (_ref) {
        var name = _ref.name,
            age = _ref.age;
        return { name: name, age: age };
    });
});

Je suppose que les résultats sont un tableau d'objets, je ne sais pas comment fonctionne mysql dans nodejs.

1voto

Redu Points 11722

Eh bien, je ne sais pas si mySQL.query() renvoie un objet Promise ou non. En supposant que ce n'est pas le cas, essayons de simuler notre fonction mySQL qui comprend une query qui renverrait un résultat de manière asynchrone dans un délai de 200 ms.

mySQL = { '1234567890' : {name: "John Doe", age: 22},
          '646494964'  : {name: "Mary Jones", age: 28},
          '4498549646' : {name: "Sam Johnson", age: 44},
          '46654654664': {name: "Terry Gibson", age: 18},
          '546646546'  : {name: "Patricia Snow", age: 31},
          query        : function(q,cb){
                           setTimeout(function(db){
                                        var result = db[q];
                                        !!result ? cb(false,result)
                                                 : cb("Nothing found for query #: " + q, void 0);
                                      }, Math.random()*200, this);
                         }
         }

Maintenant, le snippet suivant va promettre tout appel asynchrone qui prend une donnée et une erreur de premier type de callback ( cb(err, res) ).

function promisify(fun){
  return function(data){
           return new Promise((v,x) => fun(data, (err,data) => !!err ? x(err)
                                                                     : v(data)));
         }
}

Une fois que nous avons promis mySQL.query comme promisfy(mySQL.query.bind(mySQL)) il commencera à renvoyer des promesses. (Nous utilisons bind ici depuis que le fun variable de l'argument de la promisify est affectée à la fonction mySQL.query il invoquera mySQL.query avec le this comme promisify et nous ne voulons pas cela. Nous sécurisons donc fun pour être lié à mySQL tout le temps. (Bonus JS connaissance ici.. !)

Bon, OK, nous sommes presque prêts, emballons le tout et interrogeons "séquentiellement" notre DB allumette qui supporte les promesses. Afin de lier séquentiellement une série de requêtes avec promesses dans un tableau, il est préférable d'utiliser une balise .reduce() pour enchaîner les .then() les étapes de la requête précédente à la suivante. Cool

function promisify(fun){
  return function(...data){
           return new Promise((v,x) => fun(...data, (err,data) => !!err ? x(err) : v(data)));
         };
}

function mysqlQuery(query,cb){
  setTimeout(function(){
               var result = database[query];
               !!result ? cb(false,result) : cb("Nothing found for query #: " + query, void 0);
             }, Math.random()*200);
}

var numbers  = ['1234567890', '646494964', '122', '4498549646', '46654654664', '546646546'],
    mySQL    = { '1234567890' : {name: "John Doe", age: 22},
                 '646494964'  : {name: "Mary Jones", age: 28},
                 '4498549646' : {name: "Sam Johnson", age: 44},
                 '46654654664': {name: "Terry Gibson", age: 18},
                 '546646546'  : {name: "Patricia Snow", age: 31},
                 query        : function(q,cb){
                                  setTimeout(function(db){
                                               var result = db[q];
                                               !!result ? cb(false,result)
                                                        : cb("Nothing found for query #: " + q, void 0);
                                               }, Math.random()*200, this);
                                }
                },
    contents = [];

numbers.reduce((p,n) => p.then(c => promisify(mySQL.query.bind(mySQL))(n))
                         .then(d => contents.push(d), e => console.log(e)), Promise.resolve())
       .then(_ => console.log(contents));

.as-console-wrapper { max-height: 100% !important; top: 0; }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X