express + mysql:复杂查询的干净代码

时间:2018-03-18 11:22:35

标签: mysql express

我正在使用带有mysql的express来表示我的api。

此代码可以正常工作:

exports.addAuthor = function(req, res, next) {  // POST /authors {{{
  let sqlquery = '';
  let a = checkAuthor(req.body);
  if(!a.valid) {
    var myerr = new Error(a.msg);
    myerr.status = 400;
    return next(myerr);
  }
  //
  myPool.getConnection(function(err, connection) {
    if (err) { return next(err); }
    // check if exists first
    sqlquery =  'SELECT COUNT(*) AS nb FROM authors';
    sqlquery += '  WHERE name = "' + a.name + '" AND firstname = "' + a.firstname + '";';
    connection.query(sqlquery, function(err, rows) {
      if (err) {
        connection.release();
        return next(err);
      } else {
        if (rows[0].nb > 0) {
          connection.release();
          let myerr = new Error('This author already exists !');
          myerr.status = 400;
          return next(myerr);
        } else {
          sqlquery =  'INSERT INTO authors (name, firstname)';
          sqlquery += '  VALUES ("' + a.name + '","' + a.firstname + '")';
          connection.query(sqlquery, function(err, rows) {
            connection.release();
            if (err) { return next(err); }
            if (rows.affectedRows) {
              res.json({name: a.name, firstname: a.firstname, id: rows.insertId});
            }
          });
        }
      }
    });
  });
}; // }}}

首先,我想重用代码来获取作者的id,如果它存在,那么为此定义一个函数。 其次,我想编写更简单,更清晰的代码,因为我想到了更复杂的代码,以及对数据库的未来情况的多个请求。 (只有12行才能检查作者是否存在!)

我知道它必须处理Mysql查询的异步性质。 我读了很多东西,但我仍然无法编写适当的代码来实现这一点。

感谢指出我正确管理不那么简单的案例。

JPM

我想我已经成功地完成了一些昨天无效的代码! 我不知道它是不是最好的方式 我在某个地方拿了一些代码,但我不记得在哪里(可能在这里) 这是:

const execQuery = (sql, params) => new Promise((resolve, reject) => { // {{{
  myPool.getConnection(function(err, connection) {
    if (err) { 
      reject(err); 
    } else {
      connection.query(sql, function(err, rows) {
          connection.release();
        if (err) {
          reject(err);
        } else {
          resolve(rows);
        }
      })
    }
  });
}); // }}}
async function getIDAuthor(a) { // {{{
  sqlquery =  'SELECT id FROM authors';
  sqlquery += '  WHERE name = "' + a.name + '" AND firstname = "' + a.firstname + '"';
  if(a.id) {  // case update name of known author
    sqlquery += '    AND id <> ' + a.id;
  }
  try {
    rows = await execQuery(sqlquery);
    if(rows.length>0) {
      return rows[0].id;
    } else {
      return 0;
    }
  } catch (error) {
    return -1;
  }
} // }}}
exports.addAuthor = async function(req, res, next) {  // POST /authors {{{
  let sqlquery = '';
  let a = checkAuthor(req.body); // {{{
  if(!a.valid) {
    var myerr = new Error(a.msg);
    myerr.status = 400;
    return next(myerr);
  } // }}}
  let ide = await getIDAuthor(a);
  if(ide>0) {
    let myerr = new Error('This author already exists !');
    myerr.status = 400;
    return next(myerr);
  }
  sqlquery =  'INSERT INTO authors (name, firstname)';
  sqlquery += '  VALUES ("' + a.name + '","' + a.firstname + '")';
  try {
    rows = await execQuery(sqlquery);
    if (rows.affectedRows) {
      res.json({name: a.name, firstname: a.firstname, id: rows.insertId});
    }
  } catch (error) {
    return next(error);
  }
}; // }}}

我还没有检查所有可能的错误 如果需要,请随时告诉我或纠正我。

1 个答案:

答案 0 :(得分:0)

我从https://nemethgergely.com/error-handling-express-async-await/中获取了代码和想法 现在它看起来像这样:

exports.addAuthor = asyncMiddleware(async function(req, res, next) {  // POST /authors {{{
  let sqlquery = '';
  let rows;
  //
  let a = checkAuthor(req.body);
  if(!a.valid) { throw boom.badRequest(a.msg); }
  let ide = await getIDAuthor(a);
  if(ide>0) { throw boom.badRequest('Cet auteur existe déjà !'); }
  //
  sqlquery =  'INSERT INTO authors (name, firstname)';
  sqlquery += '  VALUES ("' + a.name + '","' + a.firstname + '")';
  rows = await execQuery(sqlquery);
  if (rows.affectedRows) {
    res.json({name: a.name, firstname: a.firstname, id: rows.insertId});
  }
}); // }}}

实际上这并不能处理所有错误情况。算了吧。仍处于起点。 Grrrrrr。