有问题的代码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