У меня есть следующий код, который я использую для регистрации пользователей.
const pgp = require('pg-promise')();
const crypto = require('./crypto.js');
const db = pgp(connection);
const querySelect = (text, params) => {
const s = pgp.as.format(text, params);
return db.any(s)
.then(data => {
return data;
})
.catch(error => {
return error;
});
}
const queryInsert = (text, params) => {
const s = pgp.as.format(text, params);
return db.one(s)
.then(data => {
return data;
})
.catch(error => {
return error;
});
}
const signup = (user) => {
return new Promise((resolved, rejeted)=>{
return querySelect('select username from user WHERE username = $1', [user.username])
.then(res => {
if (res.length == 0) {
return true;
}
return resolved(false); //SHOULD STOP + RETURN HERE
})
.then(hashPasswordRes=>{
return crypto.hashPassword(user.password);
})
.then(queryRes=>{
if (queryRes) {
return queryInsert('insert into user (username,password) values ($1,$2) RETURNING id',
[user.username, user.password]);
} else {
return rejeted('error while signup');
}
})
.then(res=>{
resolved(true);
})
.catch(error => {
return rejeted('error while signup');
});// catch
}) //promise
};//signup
exports.signup = signup;
Это в основном весь файл.Довольно просто, наверное.
Проблема в том, что в момент, когда я комментирую SHOULD STOP + RETURN HERE
, он возвращает false
(это означает, что это уже существующее имя пользователя, такое как вставленное), но выполнение никогда не останавливается, поэтому пользовательв конечном итоге сохраняется в базе данных (даже если return resolved(false);
выполняется).
Что я здесь не так делаю?Раньше это работало, когда в моем коде был только модуль pg .Когда я использовал pg-обещание , у него возникла эта проблема.
Честно говоря, я понятия не имею, почему «возврат» также не останавливает выполнение функции.Пожалуйста, совет
(узел 8.11.1, экспресс 4.16.3, pg 7.4.2, pg-обещание 8.4.4)
Спасибо
РЕДАКТИРОВАТЬ
для справки, здесь тот же файл без pg-обещания, который работает просто отлично.Имена переменных меняются, но вы можете видеть логику.Я пытался использовать ту же логику с pg-обещания
const crypto = require('./crypto.js');
const {Client} = require('pg');
const getuser = (mail, client) => {
return new Promise((resolved, rejeted)=>{
return client.query('select mail from user WHERE mail = $1',[mail])
.then(res => {
resolved(res.rows);
})
.catch(e => {
rejeted(e);
client.end();
}); // catch
})//promise
} //getUser
const signup = (user) => {
return new Promise((resolved, rejeted)=>{
client.connect().then(() => {
getuser(user.email, client)
.then(getUserRes => {
if (getUserRes.length==0) {
return true;
}
client.end();
return resolved(false);
})
.then(hashPasswordRes=>{
return crypto.hashPassword(user.password);
})
.then(queryRes=>{
if (queryRes) {
const nowtime = new Date();
return client.query('insert into user(mail, password) values ($1,$2)',
[user.email, queryRes])
} else {
client.end();
return rejeted('some error');
}
})
.then(res=>{
resolved(true);
client.end();
})
}) // client.connect then
.catch(error => {
rejeted('some error');
client.end();
});// catch
}) //promise
};//signup
exports.signup = signup;