Как передать параметры в callback-запрос mysql в nodejs
Я пытаюсь выяснить правильный способ передачи пользовательских данных в запрос запроса, который будет доступен в обратном вызове.
Я использую библиотеку MySQL в nodejs (все последние версии).
У меня есть вызов connection.query(sql, function (err, result) {...});
Я не мог найти способ: 1) передать пользовательские данные/параметр для вызова, чтобы 2) его можно было сделать доступным при вызове обратного вызова.
Итак, каков правильный способ сделать это?
У меня есть следующий (псевдокод):
...
for (ix in SomeJSONArray) {
sql = "SELECT (1) FROM someTable WHERE someColumn = " + SomeJSONArray[ix].id;
connection.query(sql, function (err, result) {
...
var y = SomeJSONArray[ix].id;
};
}
Из приведенного выше кода мне нужно иметь возможность передать текущее значение "ix", используемое в запросе, самому обратному вызову.
Как это сделать?
Ответы
Ответ 1
Если вы используете node -mysql, сделайте это, как говорят документы:
connection.query(
'SELECT * FROM table WHERE id=? LIMIT ?, 5',[ user_id, start ],
function (err, results) {
}
);
В документах также есть код для правильного экранирования строк, но использование массива в запросе запроса автоматически выполняет экранирование для вас.
https://github.com/felixge/node-mysql
Ответ 2
Чтобы ответить на исходный вопрос с полным ответом/примером для иллюстрации, оберните обратный вызов анонимной функцией, которая сразу же создаст область, содержащую "моментальный снимок", если вы будете передавать данные.
var ix=1;
connection.query('SELECT 1',
(function(ix){
return function(err, rows, fields) {
console.log("ix="+ix);
console.log(rows);
};
})(ix));
Для тех, кто был знаком с этой концепцией, поскольку я был 20 минут назад, последний}) (ix)); это внешнее значение var ix = 1, которое передается (функция (ix) {. Это может быть переименовано (функция (abc) {если вы изменили console.log( "ix =" + abc);
fwiw (Спасибо Крису за ссылку, которая заполнила пробелы, чтобы прийти к решению)
Ответ 3
В то время как нормально передавать переменные или объекты в функцию обратного вызова запроса mysql с использованием тактики, описанной ранее, - обертывание функции обратного вызова в анонимной функции - я думаю, что это в значительной степени не нужно, и я объясню, почему пример:
// This actually works as expected!
function run_query (sql, y) {
var y1 = 1;
connection.query (sql, function (error, rows, fields) {
if (! error)
{
var r = rows[0];
console.log ("r = " + r[1]);
console.log ("x = " + x);
console.log ("y = " + y);
console.log ("y1= " + y);
console.log ("");
}
else
{
console.log ("error = " + error);
}
});
};
var x = 5;
console.log ("step 1: x = " + x);
run_query ("SELECT 1", x);
x = x + 1;
console.log ("step 2: x = " + x);
run_query ("SELECT 1", x);
x = x + 1;
console.log ("step 3: x = " + x);
Производит следующий вывод:
step 1: x = 5
step 2: x = 6
step 3: x = 7
r = 1
x = 7
y = 5
y1= 5
r = 1
x = 7
y = 6
y1= 6
Страх в том, что второй вызов run_query() перезапишет переменную y и/или y1 до того, как первый вызов run_query() имеет возможность вызвать функцию обратного вызова. Однако переменные в каждом экземпляре вызываемой функции run_query() фактически изолированы друг от друга, сохраняя день.