数组在字符串处理中的妙用

187 阅读1分钟

原有代码

有问题的代码

/**
 * 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语句的编写,刚刚看到最近在做的一个开源项目的上面的代码,这是一个更新用户信息的操作,参数为一个对象,属性对应数据库中的字段,这里的目的很简单,根据传入参数的属性是否为空来选择是否更新对应字段的值。

这种的采用字符串拼接的方式不仅特别丑而且容易出错。很显然,如果第一个属性值就不存在,那么整个SQL语句都会报错。

改进版本


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语句。

源码地址

更多

这里只是抛砖引玉,希望能看到各位大神们更棒的方案。