Функция pg.any асинхронная, и как следствие
res[0].error = errors;
выполняется раньше обработки уникальных логинов. Чтобы работало правильно нужно отложить работу с ошибками до момента исполнения всех запросов к БД:
User.prototype.join = function (user, res) {
var errors = [],
unique = [];
for (var i = 0; i < user.length; i++) {
if (user[i].required && !user[i].value) {
errors.push('Вы не ввели логин');
}
if (user[i].unique) {
var query = pg.any('SELECT id FROM users WHERE login=$1', [user[i].value]).then(function (user) {
if (user.length) {
errors.push('Пользователь с таким логином уже зарегистрирован');
}
});
unique.push(query);
}
}
return Promise.all(unique).then(function () {
res[0].error = errors;
});
};
И отдачу роутам нужно обернуть в then:
// неправильно
join(user, res);
// дальнейшая обработка res
// правильно
join(user, res).then(function () {
// дальнейшая обработка res
});
Конструкция
(function (i) { ... })(i);
в изначальном варианте бессмысленна, потому я её убрал. А
if (user[i].unique == true) {
идентично
if (user[i].unique) {
.
Из-за того, что я не вижу полного кода могут быть ошибки.