2016-08-01 58 views
1

我想知道,在開發數據庫調用node.js api時,保持代碼乾燥的最佳實踐是什麼。node.js api keep code dry

我好像我有很多重複的代碼。

例如,看看這個:

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


}); 

如何避免錯誤處理的重複,連接電話,並只專注於路線和查詢。

謝謝!

+2

其中之一,你可以使用['pool.query()'](https://github.com/brianc/node-pg-pool#your-new-favorite-helper-method)而不是'connect( )/查詢()/()完成'。 – robertklep

+0

謝謝!使用API​​調用和pool.query完成這項工作! 我想我可以使用pool.on進行常見的錯誤處理,對吧? –

+0

使用'pool.on()'進行全局錯誤處理的問題在於,您可能無法發送HTTP響應(如500)來指示發生錯誤(因爲'on'處理程序贏了'無法訪問'res')。 – robertklep

回答

1

在樣品看看下面,應該幫助

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

對於初學者來說,使用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邏輯,這取決於應用程序的需求。

+0

謝謝!也許你可以提供鏈接以獲取更多關於請求/響應的信息,我想知道最佳實踐。 –

+0

@tzvikaofek它將取決於您的API響應是否可以概括爲一段代碼,就像我說的 - 這取決於項目的要求。 –