我有以下代码,我用来注册用户。
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-promise时,它开始出现这个问题。
坦率地说,我不知道为什么"return“没有停止函数的执行。敬请指教
(节点8.11.1,express 4.16.3,pg 7.4.2,pg-promise 8.4.4)
谢谢
编辑
需要说明的是,这里是不带pg-promise的相同文件,它工作得很好。变量名称会发生变化,但您可以看到其中的逻辑。我尝试在pg-promise中使用相同的逻辑
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;
发布于 2018-06-05 04:30:19
返回结束正在运行的当前函数,它不是promise链。所以这一部分:
return resolved(false); //SHOULD STOP + RETURN HERE
结束当前函数,即:
res => {
if (res.length == 0) {
return true;
}
return resolved(false); //SHOULD STOP + RETURN HERE
}
请注意,箭头声明了一个函数。
如果你想停止一条链,你可以这样做
Promise.resolve(res)
.then(res => {
if (shouldKeepGoing(res)) {
return allTheOtherPromises(res)
}
return true
})
const allTheOtherPromises = res => {
// Here you do all the promises you were doing
}
https://stackoverflow.com/questions/50686140
复制相似问题