【问题标题】:node.js api keep code drynode.js api 保持代码干燥
【发布时间】:2016-08-01 09:34:45
【问题描述】:

我想知道,在使用数据库调用开发 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});
    });
  });


});

如何避免重复处理错误,连接调用,只关注路由和查询。

谢谢!

【问题讨论】:

  • 一方面,您可以使用pool.query() 而不是connect()/query()/done()
  • 谢谢!使用 api 调用和 pool.query 就可以了!我想我可以使用 pool.on 来处理常见的错误,对吧?
  • 使用pool.on() 进行全局错误处理的问题是,您可能无法发送HTTP 响应(如500)来指示发生了错误(因为on处理程序将无权访问res)。
  • 所以也许最好的方法是创建一个获取路由、查询和 res 的方法,就像 @medet 建议的那样
  • 建议的代码与使用pool.query()(而不是customPool)时的代码基本相同。您仍然需要处理错误(正确地说,return console.log() 将导致请求停止)。

标签: node.js postgresql express dry


【解决方案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});
  });
});

【讨论】:

    【解决方案2】:

    对于初学者,使用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-&gt;response 逻辑来进一步简化它,具体取决于您的应用程序的要求。

    【讨论】:

    • 谢谢!也许您可以提供链接以获取有关请求/响应的更多信息,我想了解最佳实践。
    • @tzvikaofek 这取决于您的响应 API 是否可以概括为一段代码,就像我说的那样 - 这取决于项目的要求。
    猜你喜欢
    • 1970-01-01
    • 2021-06-17
    • 2019-01-26
    • 1970-01-01
    • 2023-03-08
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多