2016-08-01 9 views
1

Ich frage mich, was ist die beste Vorgehensweise, um den Code DRY bei der Entwicklung von node.js API mit Datenbankaufrufen zu halten.node.js API Code beibehalten

Ich scheint wie ich viel Code wiederholt habe.

Zum Beispiel, schauen Sie sich dieses:

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}); 
    }); 
    }); 


}); 

und diese:

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}); 
    }); 
    }); 


}); 

Wie kann ich die Wiederholung der Fehler Gabe, verbinden Anruf vermeiden, und konzentrieren sich nur auf der Route und Abfrage.

Danke!

+2

Zum einen können Sie ['pool.query()'] (https://github.com/brianc/node-pg-pool#your-new-favorite-helper-method) anstelle von 'connect ()/query()/done() '. – robertklep

+0

danke! using api Anruf und pool.query macht den Job! Ich denke, ich kann pool.on für die gemeinsame Fehlerbehandlung verwenden, oder? –

+0

Das Problem bei der Verwendung von 'pool.on()' für die globale Fehlerbehandlung besteht darin, dass Sie wahrscheinlich keine HTTP-Antwort (z. B. 500) senden können, um anzuzeigen, dass ein Fehler aufgetreten ist (seit der 'on'-Handler gewonnen hat). t Zugang zu 'res' haben. – robertklep

Antwort

1

Werfen Sie einen Blick auf Probe unter,

//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

Für den Anfang sollte helfen, pg-promise für Datenbank-Kommunikation verwenden, manuell eine Verbindung zu vermeiden. Dann wird Ihr Code viel einfacher, wie unten gezeigt.

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); 
     }); 
}); 

Dann können Sie es weiter vereinfachen, durch eine generische request->response implementierende Logik, abhängig von den Anforderungen Ihrer Anwendung.

+0

danke! Vielleicht können Sie Links bereitstellen, um mehr Informationen über Anfragen/Antworten zu erhalten. Ich würde gerne die Best Practices dazu erfahren. –

+0

@tzvikaofek es hängt davon ab, ob Ihre API für Antworten in einem Stück Code verallgemeinert werden kann oder nicht, wie ich sagte - es hängt von den Anforderungen des Projekts ab. –