Bạn đang có một khởi đầu thực sự tốt, nhưng có thể bạn đã suy nghĩ quá mức về nó một chút. Bí quyết là tạo một truy vấn với trình giữ chỗ (?
) dưới dạng một chuỗi và đồng thời xây dựng một mảng giá trị.
Vì vậy, nếu bạn có params = { name: 'foo', age: 40 }
, bạn muốn xây dựng các đối tượng sau:
where = 'name LIKE ? AND age = ?';
values = [ '%foo%', 40 ];
Nếu bạn chỉ có { name: 'foo' }
, thay vào đó bạn sẽ tạo những thứ này:
where = 'name LIKE ?';
values = [ '%foo%' ];
Dù bằng cách nào, bạn có thể sử dụng các đối tượng đó trực tiếp trong query
phương pháp, tức là:
var sql = 'SELECT * FROM table WHERE ' + where;
connection.query(sql, values, function...);
Vậy chúng ta xây dựng những đối tượng đó như thế nào? Trên thực tế, mã thực sự giống với buildQuery
của bạn nhưng ít phức tạp hơn.
function buildConditions(params) {
var conditions = [];
var values = [];
var conditionsStr;
if (typeof params.name !== 'undefined') {
conditions.push("name LIKE ?");
values.push("%" + params.name + "%");
}
if (typeof params.age !== 'undefined') {
conditions.push("age = ?");
values.push(parseInt(params.age));
}
return {
where: conditions.length ?
conditions.join(' AND ') : '1',
values: values
};
}
var conditions = buildConditions(params);
var sql = 'SELECT * FROM table WHERE ' + conditions.where;
connection.query(sql, conditions.values, function(err, results) {
// do things
});