數組在字符串處理中的妙用

原有代碼

有問題的代碼javascript

/** * update user information * for example: * UPDATE Person SET * Address = 'Zhongshan 23', * City = 'Nanjing' * WHERE LastName = 'Wilson' */
exports.updateUser = function (userObj) {
  let sqlStr = 'update user set ';
  
  userObj.state && (sqlStr += 'state = ' + userObj.state);
  userObj.active_code && (sqlStr += ', active_code = ' + userObj.active_code);
  userObj.exptime && (sqlStr += ', exptime = "' + dayjs().add(10, 'minute').format('YYYY-MM-DD HH:mm:ss') + '"');
  userObj.is_use && (sqlStr += ', is_use = ' + userObj.is_use);
  sqlStr += ' where `email` = ? ';
  return db.query(sqlStr, [userObj.email]);
}
複製代碼

在nodejs中,咱們會涉及到操做數據庫,SQL語句的編寫,剛剛看到最近在作的一個開源項目的上面的代碼,這是一個更新用戶信息的操做,參數爲一個對象,屬性對應數據庫中的字段,這裏的目的很簡單,根據傳入參數的屬性是否爲空來選擇是否更新對應字段的值。java

這種的採用字符串拼接的方式不只特別醜並且容易出錯。很顯然,若是第一個屬性值就不存在,那麼整個SQL語句都會報錯。node

改進版本

exports.updateUser = function (userObj) {
  let sqlStr = 'update user set ',
    params = [];

  userObj.state && params.push('state = ' + userObj.state);
  userObj.active_code && params.push('active_code = ' + userObj.active_code);
  userObj.exptime && params.push('exptime = "' + dayjs().add(10, 'minute').format('YYYY-MM-DD HH:mm:ss') + '"');
  userObj.is_use && params.push('is_use = ' + userObj.is_use);

  sqlStr = sqlStr.concat(params.join(", "), ' where `email` = ? ');
  return db.query(sqlStr, [userObj.email]);
}
複製代碼

這裏利用臨時數組保存須要更新的字段字符串,利用**join()**方法進行格式化,最後利用concat將全部字符串拼接成一個完成的SQL語句。git

源碼地址github

更多

這裏只是拋磚引玉,但願能看到各位大神們更棒的方案。sql

相關文章
相關標籤/搜索