Использование Promises с запросами с Node.JS / NPM MySQL Library - PullRequest
0 голосов
/ 01 июня 2018

Я использую библиотеку mysql NPM с Node.JS, и я пытаюсь выполнить запрос к базе данных и заставить функцию возвращать Promise вместо запроса обратного вызова.Вот что я попробовал:

index.js:

var result = await asyncQuery.main(connection, "SELECT * FROM tbl WHERE id = ?", "1234567890")

asyncQuery.js:

var colors = require('colors')

module.exports = {
  main: function(con, q, vars) {
    return new Promise((resolve, reject) => {
      if (!vars) {
        con.query(q, function (err, result) {
          if (err) {
            console.log(colors.red(err.stack))

            return reject(err);
          }
          resolve(result)
        })
      }
      else {
        con.query(q, vars, function (err, result) {
          if (err) {
            console.log(colors.red(err.stack))

            return reject(err);
          }
          resolve(result)
        })
      }
    })
  }
}

Это прекрасно работает, если не переданы переменные / аргументы (?), но как только используется ?, я получаю сообщение об ошибке:

Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1

Если бы я выполнил обычный запрос с обратным вызовом, это бы прекрасно работало.Что-то не так с asyncQuery.js, но я не уверен, в чем проблема.

У кого-нибудь есть исправление для этого кода или более простой способ достижения моей цели?Я слышал о Promise MySQL Library , но я не уверен, поддерживает ли она обратные вызовы Promise и .Если это произойдет, дайте мне знать, и я сделаю это.

NodeJS Версия: 9.1.0

Версия NPM: 5.5.1

NPMВерсия библиотеки MySQL: 2.15.0

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Этот точный запрос работает и не вызовет эту ошибку. Возможно, у вас был более сложный запрос с несколькими заполнителями, например:

SELECT * FROM tbl WHERE id = ? or ref_id = ?,

В этом случае вместо отправкистрока, вам нужно будет отправить массив с таким количеством значений, сколько у вас есть * 1006.

Так что просто отправьте: ["1234567890", "1234567890"] вместо строки для вышеуказанного запроса.

ДалееВаш метод может быть упрощен до:

module.exports = {
    main(con, q, vars) {
        return new Promise((resolve, reject) => {
            con.query(q, vars, function(err, result) {
                if (err) {
                    console.log(colors.red(err.stack))

                    return reject(err);
                }
                resolve(result)
            })
        })
    }
}

Позволяет вам сбросить if/else.

В качестве личной заметки я предпочитаю пакет mysql2, в котором уже есть оберните обещание и это быстрее, чем mysql, с преимуществом, имеющим почти тот же API.

0 голосов
/ 01 июня 2018

Вы можете использовать пакет mysql-обещание из npmjs, который действует как оболочка для mysql и mysql2: https://www.npmjs.com/package/mysql-promise

Пример использования:

var db = require('mysql-promise')();

db.configure({
    "host": "localhost",
    "user": "foo",
    "password": "bar",
    "database": "db"
});

db.query('UPDATE foo SET key = ?', ['value'])
.then( function(){ return db.query('SELECT * FROM foo'); })
.spread(function (rows) { console.log('Loook at all the foo', rows); });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...