在 NodeJS 中使用 BETWEEN 子句
Posted
技术标签:
【中文标题】在 NodeJS 中使用 BETWEEN 子句【英文标题】:Using BETWEEN Clause in NodeJS 【发布时间】:2017-12-29 06:25:19 【问题描述】:我想使用 BETWEEN 子句从 mysql 数据库中获取数据。
在客户端,我使用 JQuery 创建了 2 个内联日历,并使用 socket.io 发出选定的 date 值;
$('#fromDate').datepicker(
inline: true,
altField: '#d',
dateFormat: "dd-mm-yy",
altFormat: "yy-mm-dd",
monthNames: ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"],
dayNamesMin: ["Pa", "Pt", "Sl", "Ça", "Pe", "Cu", "Ct"],
firstDay: 1,
numberOfMonths: 1,
onSelect: function(dateText, inst)
var dateAsString = dateText; //the first parameter of this function
var dateAsObject = $(this).datepicker('getDate'); //the getDate method
console.log(dateAsString);
socket.emit('socketfromDate', $('#d').val());
);
$('#toDate').datepicker(
inline: true,
altField: '#x',
dateFormat: "dd-mm-yy",
altFormat: "yy-mm-dd",
monthNames: ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"],
dayNamesMin: ["Pa", "Pt", "Sl", "Ça", "Pe", "Cu", "Ct"],
firstDay: 1,
numberOfMonths: 1,
onSelect: function(dateText, inst)
var dateAsString = dateText; //the first parameter of this function
var dateAsObject = $(this).datepicker('getDate'); //the getDate method
console.log(dateAsString);
socket.emit('sockettoDate', $('#x').val());
);
在服务器端,如果我在 'fromDate' 值之后收到 'toDate' 值,MySql 查询必须在这几天之间获取数据。
var fromDate_query,
toDate_query;
io.on('connection', function(socket)
socket.on('socketfromDate', function(fromDate)
console.log();
console.log("----------------------------------");
console.log("Selected dateTime 'from': " + fromDate); //output: Selected dateTime 'from': 2017-07-01
console.log("----------------------------------");
console.log();
fromDate_query = fromDate;
);
socket.on('sockettoDate', function(toDate)
console.log();
console.log("----------------------------------");
console.log("Selected dateTime 'to': " + toDate); //output: Selected dateTime 'to': 2017-07-13
console.log("----------------------------------");
console.log();
toDate_query = toDate;
connection.query("SELECT * FROM report WHERE date BETWEEN ? AND ?", [fromDate_query, toDate_query], function(err, rows)
if (err) console.log(err);
else
for (var i = 0; i < rows.length; i++)
var row = rows[i];
console.log("**********************************");
console.log("Possible machine: " + row.machine); //output: nothing
console.log("**********************************");
);
);
);
问题是,什么都没有发生。
两天之间查询的最佳方法是什么?
【问题讨论】:
【参考方案1】:您的代码存在三个问题:
使用两个事件分别发送 to 和 from 日期,而您需要两个数据来处理 SQL 查询。
既然可以使用套接字,为什么还要使用 / 最好将 http 请求用于事务性内容。
查询应在事件内部完成,因为当您从客户端发出数据时,数据将出现在该事件中。
回答你的问题。您将不得不重构您的代码以将两个单独的事件删除为一个事件,该事件将接收您的日期和日期,如下所示:
socket.on('dates', function(dateData)
var toDate_query = dateData.toDate;
var fromDate_query = dateData.fromDate;
connection.query("SELECT * FROM report WHERE date BETWEEN ? AND ?", [fromDate_query, toDate_query], function(err, rows)
if (err) console.log(err);
else
for (var i = 0; i < rows.length; i++)
var row = rows[i];
console.log("**********************************");
console.log("Possible machine: " + row.machine); //output: nothing
console.log("**********************************");
);
除此之外,您必须重构前端以仅在两个日期都被选中时才发出事件。
编辑: BONUS POINT -> 收到查询数据后请释放SQL连接
【讨论】:
我无法重构我的客户端,但是当我尝试时,我发现了问题所在;我选择的日期没有记录,这就是为什么它什么也没显示。 :) 而且我不想刷新页面,这就是我使用 socket.io 的原因。感谢您的宝贵时间。 @erayaras 即使它确实有任何记录,您的代码也不会按预期工作。请仔细查看我上面列出的要点,并可能阅读 socket.io 事件侦听器和事件侦听器内的对象范围。以上是关于在 NodeJS 中使用 BETWEEN 子句的主要内容,如果未能解决你的问题,请参考以下文章