2013-09-15 1 views
1

Я сбиваю себе голову этим с прошлой ночи. Когда я добавляю параметры в sql, это не работает.Невозможно использовать параметризованные SQL-выражения с помощью Node.js и Postgres

var findOne = function(username, cb) { 
    pg.connect(pgURL, function(err, client, done) { 
     var query = client.query('SELECT * FROM users WHERE username = $1', [username]); 
     done(); 

     query.on('row', function(row) { 
      cb(err, row); 
     }); 
    }); 
}; 

Однако, если я выполняю инструкцию SQL без параметризации, она работает нормально.

var query = client.query("SELECT * FROM users WHERE username = 'foobar'"); 

Кроме того, делая console.log (запрос), сразу после того, сделано(), получаем следующее:

13:48:00 web.1 | { domain: null, 
13:48:00 web.1 | _events: null, 
13:48:00 web.1 | _maxListeners: 10, 
13:48:00 web.1 | name: undefined, 
13:48:00 web.1 | text: 'SELECT * FROM users WHERE username = $1', 
13:48:00 web.1 | values: [ '{"username":"foobar"}' ], 
13:48:00 web.1 | callback: undefined, 
13:48:00 web.1 | _result: 
13:48:00 web.1 | { command: null, 
13:48:00 web.1 |  rowCount: null, 
13:48:00 web.1 |  oid: null, 
13:48:00 web.1 |  rows: [], 
13:48:00 web.1 |  fields: [], 
13:48:00 web.1 |  _parsers: [], 
13:48:00 web.1 |  RowCtor: null }, 
13:48:00 web.1 | _addedFields: false, 
13:48:00 web.1 | _canceledDueToError: false } 

Что я здесь делаю неправильно?

ответ

1

Ваша переменная имя пользователя является объектом Javascript с ключевым именем пользователя и значением foobar. Попробуйте username.username ссылаться только на значение.

В качестве альтернативы, я настоятельно рекомендую Sequelize ORM, который находится поверх pg. Посмотрите здесь: http://sequelizejs.com/documentation#usage-raw-queries

+0

Отличный улов. Спасибо, это именно то, что было проблемой. – Ahmed

0

Вы уверены, что имя пользователя - строка? Попробуйте сделать username.toString().

+0

добавив имя пользователя.toString(), не изменив результаты. Я добавил результат console.log (query) (который я добавил сразу после done()) в исходное сообщение. – Ahmed

Смежные вопросы