Let's assume that you are not using ORM to interact with the database.
The asynchronous function for retrieving a user from a PostgreSQL database can be:
// fetch_user.js var pg = require('pg'); module.exports = fetchUser = function (username, done) { // Создаем клиента базы данных. По-хорошему, здесь вы должны использовать // пул соединений, заранее сконфигурированный и передваемый // "из вне". Для простоты я использую одиночного клиента БД. var client = new pg.Client(); // Устанавливаем соединение с БД. client.connect(function (err) { if (err) { // Ошибка подключения. Возвращаем ее на уровень выше. return done(err); } // Отправляем запрос в базу. client.query( 'SELECT * FROM users WHERE username = $1::text', [username], function (err, results) { // Закрываем соединение с БД. client.end(); // Возвращаем ошибку или результат запроса. // Если пользователь не найден, возвращаем null вместо данных. done(err, result.rows[0] || null); } ); }); };
And this is how it can be used:
var passport = require('passport'), LocalStrategy = require('passport-local').Strategy, fetchUser = require('./fetch_user.js'); passport.use(new LocalStrategy({ usernameField: 'ogrn', passwordField: 'okpo' }, function(username, password, done) { fetchUser(username, function(err, user) { if (err) { return done(err); } if (!user) { return done(null, false, {message: 'Incorrect username.'}); } // По-хорошему, в базе вы должны хранить хэш пароля. А раз так, то // переменную "password" стоит захешировать перед сравнением. if (user.password !== password) { return done(null, false, {message: 'Incorrect password.'}); } done(null, user); }); }));