NodeJS MySQL Concat запросов с ответами от многих модельных запросов на один вызов контроллера - PullRequest
0 голосов
/ 08 января 2019

У меня проблемы с пониманием асинхронных методов на nodejs.

У меня есть этот фрагмент кода в моем контроллере:

 app.get(basePath, function (req, res, next) {

        model.generateDB(function (modelErr, modelRes) {
            if (modelErr) console.log('Error: ' + modelErr);
            next(res.send(modelRes));
        });

    });

этот фрагмент кода для модели:

generateDB: function (next) {

        BDManager.query(
            'INSERT INTO tableName' +
            '(field1, field2) VALUES ("a", "b")',
        function (err, res) { 
            next(err, res); 
        });

    }

и этот фрагмент кода для менеджера БД

query: function (sql, next) {

    var con = mysql.createConnection(config.MySQL);

    con.query(sql, function (err, res) {
        if (err) next(err, null);
        next(null, res);
    });

    con.end();

}

У меня отлично работает. вопрос в том, как я могу иметь несколько запросов с ответами в модели только с одним вызовом контроллера, как в примере (это не работает):

BDManager.query(
    'INSERT INTO tableName' +
    '(field1, field2) VALUES ("a", "b")',
function (err, res) { 
    next(err, res); 
});
BDManager.query(
    'INSERT INTO tableName' +
    '(field1, field2) VALUES ("a", "b")',
function (err, res) { 
    next(err, res); 
});
BDManager.query(
    'INSERT INTO tableName' +
    '(field1, field2) VALUES ("a", "b")',
function (err, res) { 
    next(err, res); 
});

Идея может заключаться в том, чтобы получить массив ошибок и ответов, но я не знаю, как отправить его, когда все запросы завершатся. Я пробовал с .then, но, похоже, он не работает (ошибка, которую я получаю при использовании .then - «затем нельзя использовать при нулевом значении»).

Другое решение может заключаться в объединении множества запросов в один, но я пробовал с разделителем «;» и у меня не работает.

1 Ответ

0 голосов
/ 08 января 2019

Так что это использует обратные вызовы (.then для обещаний). Вы можете создать оболочку для обещаний, которая позволит вам обещать это, а затем вы можете ожидать их или использовать обещание. Все, если хотите запустить их параллельно.

Например:

function promiseQuery(query, params) {
  return new Promise((resolve, reject) => {
    BDManager.query(query, params, function (err, res) {  
      if (err) return reject(err);
      return resolve(res);
    });
  });
}


let arrayOfResponses = await Promise.all([
  promiseQuery(query1, params1),
  promiseQuery(query2, params2),
  promiseQuery(query3, params3),
]);

Только несколько вещей об этом - вы, вероятно, должны вставлять значения через параметризованные входы Ваша библиотека SQL должна поддерживать это

Также ошибка приведет к отказу в этом. Если вы хотите перехватить эти ошибки и поместить их в массив, вы можете сделать это также с помощью обработчика .catch.

Если вы не используете async / await или совместимую версию узла, вы также можете сделать:

Promise.all([]).then(arrayOfResponses => {});

Также, и это даст вам массив ответов на любые обещания, которые вы передаете обещанию. Все.

Существует множество статей о том, как использовать Обещания и как они работают, но это должно помочь вам начать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...