Habilite marcadores de posição nomeados em node-mysql

mysqlmódulo usa ?caracteres como espaços reservados para valores, por exemplo

connection
.query('SELECT ?, ?', [
'foo',
'bar'
]);

Este exemplo é equivalente a:

connection.query('SELECT ' + connection.escape('foo') + ', ' + connection.escape('bar'));

No entanto, essa abordagem se torna difícil de ler conforme a consulta se torna grande e a lista de valores longa.

Existe uma alternativa: marcadores de posição nomeados.

connection
.query('SELECT :foo, :bar', {
foo
: 'FOO',
bar
: 'BAR'
});

Este último é equivalente a:

connection.query('SELECT ' + connection.escape('FOO') + ', ' + connection.escape('BAR'));

Os nomes dos marcadores de posição podem aparecer várias vezes, por exemplo

connection
.query('SELECT :foo, :foo', {
foo
: 'FOO'
});

Este último é equivalente a:

connection.query('SELECT ' + connection.escape('FOO') + ', ' + connection.escape('FOO'));

No momento em que este livro foi escrito, mysql não oferece suporte a parâmetros nomeados .

No entanto, é fácil corrigir o Connection.prototype.queryprotótipo para adicionar o suporte:

Primeiro, você precisa instalar o named-placeholderspacote.

Em seguida, aplique o patch Connection.prototype.query:

const toUnnamed = require('named-placeholders')();
const originalQuery = require('mysql/lib/Connection').prototype.query;

require
('mysql/lib/Connection').prototype.query = function (...args) {
if (Array.isArray(args[0]) || !args[1]) {
return originalQuery.apply(this, args);
}

([
args
[0],
args
[1]
] = toUnnamed(args[0], args[1]));

return originalQuery.apply(this, args);
};

É isso aí. Agora você pode usar marcadores de posição nomeados.

Veja um artigo completo sobre como usar o MySQL em Node.js http://gajus.com/blog/8/using-mysql-in-node-js .