node.js api保持代码干燥

我想知道,当用数据库调用开发node.js api时,保持代码干燥的最佳实践是什么。

我好像有很多重复的代码。

例如,看看这个:

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

和这个:

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

我怎样才能避免error handling的重复,连接调用,只关注路由和查询。

谢谢!

看看下面的示例,应该帮助

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

对于初学者来说,使用pg-promise进行数据库通信,避免手动连接。 那么你的代码会更简单,如下所示。

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

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

然后,通过实现一个通用的request->response逻辑,您可以进一步简化它,这取决于您的应用程序的要求。

Interesting Posts