node.js api保持代码干

时间:2016-08-01 09:34:45

标签: node.js postgresql express dry

我想知道,在使用数据库调用开发node.js api时,保持代码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 个答案:

答案 0 :(得分: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 :(得分: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逻辑进一步简化它,具体取决于您的应用程序的要求。