Как передать параметры в 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() фактически изолированы друг от друга, сохраняя день.