原有代码
有问题的代码
/**
* 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语句。
更多
这里只是抛砖引玉,希望能看到各位大神们更棒的方案。