2016-08-01 1 views
1

Je me demandais, quelle est la meilleure pratique pour garder le code DRY lors du développement node.js api avec des appels de base de données. J'ai l'impression d'avoir beaucoup de code répété.node.js api garder le code sec

Par exemple, regardez ceci:

app.get('/api/users_count', function (req,res) { 
    pool.connect(function(err, client, done) { 
    if(err) { 
     return console.error('error fetching client from pool', err); 
    } 
    client.query('SELECT count(*) FROM users;', function(err, result) { 
     done(); 

     if(err) { 
     return console.error('error running query', err); 
     } 
     res.json({"users count": result.rows[0].count}); 
    }); 
    }); 


}); 

et ceci:

app.get('/api/users/:id', function (req,res) { 
    pool.connect(function(err, client, done) { 
    if(err) { 
     return console.error('error fetching client from pool', err); 
    } 
    client.query('SELECT name FROM users WHERE id=$1;',req.param.id, function(err, result) { 

     done(); 

     if(err) { 
     return console.error('error running query', err); 
     } 
     res.json({"user name": result.rows[0].name}); 
    }); 
    }); 


}); 

Comment puis-je éviter la répétition de la remise d'erreur, connectez appel, et se concentrer sur la route et la requête.

Merci!

+2

Pour un, vous pouvez utiliser ['pool.query()'] (https://github.com/brianc/node-pg-pool#your-new-favorite-helper-method) au lieu de 'connect ()/query()/done() '. – robertklep

+0

merci! en utilisant api call et pool.query fait le travail! Je pense que je peux utiliser pool.on pour la gestion des erreurs courantes, non? –

+0

Le problème avec l'utilisation de 'pool.on()' pour le traitement des erreurs globales est que vous ne pourrez probablement pas envoyer de réponse HTTP (comme 500) pour indiquer qu'une erreur est survenue (puisque le gestionnaire 'on' a gagné ' t avoir accès à 'res'). – robertklep

Répondre

1

Jetez un oeil à l'échantillon ci-dessous, devrait aider

//Create fn that connects, pulls data, and passes it to callback 
function customPool(query, values, callback) { 
    pool.connect(function(err, client, done) { 
    if(err) 
     return callback(err); 
    client.query(query, values, function(q_err, result) { 
     done(); 
     if(q_err) 
     return callback(q_err); 
     callback(null, result.rows); 
    }); 
    } 
} 

//Reuse it 
app.get('/api/users_count', function (req,res) { 
    var query = 'SELECT count(*) FROM users;'; 
    customPool(query, undefined, function(err, rows) { 
    if(err) 
     return console.error('error fetching client from pool', err); 
    res.json({"users count": rows[0].count}); 
    }); 
}); 

app.get('/api/users/:id', function (req,res) { 
    var query = 'SELECT name FROM users WHERE id=$1;'; 
    customPool(query, req.params.id, function(err, rows) { //<-- notice, req.params.id not req.param.id 
    if(err) 
     return console.error('error fetching client from pool', err); 
    res.json({"users name": rows[0].name}); 
    }); 
}); 
1

Pour commencer, utilisez pg-promise pour les communications de base de données, afin d'éviter la connexion manuellement. Ensuite, votre code sera beaucoup plus simple, comme indiqué ci-dessous.

Code 1:

app.get('/api/users_count', function (req, res) { 
    db.one('SELECT count(*) FROM users') 
     .then(data=> { 
      res.json({"users count": +data.count}); 
     }) 
     .catch(error=> { 
      // should provide a response here also ;) 
      console.error(error); 
     }); 
}); 

Code 2:

app.get('/api/users/:id', function (req, res) { 
    db.one('SELECT name FROM users WHERE id=$1', +req.param.id) 
     .then(user=> { 
      res.json({"user name": user.name}); 
     }) 
     .catch(error=> { 
      // should provide a response here also ;) 
      console.error(error); 
     }); 
}); 

Ensuite, vous pouvez simplifier davantage, en mettant en œuvre une logique request->response générique, en fonction des besoins de votre application.

+0

merci! peut-être vous pouvez fournir des liens pour obtenir plus d'informations sur la demande/réponse, je voudrais savoir sur les meilleures pratiques à cela. –

+0

@tzvikaofek cela dépend si votre API pour les réponses peut être généralisée dans un morceau de code ou non, comme je l'ai dit - cela dépend des exigences du projet. –