我想要做的就是运行查询,检查电子邮件地址是否已经注册,如果是,请拒绝该请求,如果没有运行某些验证,然后在我的users表中创建用户。这是一个shell,代码最初基于https://github.com/vitaly-t/pg-promise-demo,代码很惊人,但我不是。承诺对我来说完全没有意义,我不知道我应该归还什么或者在哪里。
此代码运行并实现了它应该达到的目标,但随后它会触及捕获并发送回来"无法读取属性'然后'未定义"。当我尝试链接第二个。然后它不在第一个.then()时,我得到错误,我试图在已经发送之后改变res。
有人可以帮我理解这里有什么问题以及如何解决它?
useradd: function (req, res) {
db.users.findbyemail(req.body.email)
.then(function(data){
if( typeof data === undefined || data === null) {
db.users.add({
provider: 'local',
email: req.body.email,
password: req.body.password,
salt: 'salt',
displayName: req.body.displayName })
.then(function(data){
res.json({
success: true,
data: "Account created"
})
})
} else {
res.json({
success: false,
error: "Email address " + req.body.email + " is already registered on this site"
})
}
})
.catch(function(error){
res.json({
success: false,
error: error.message || error
})
})
}
答案 0 :(得分:0)
我最终得到了一些工作,应用Bergi的规则确实在正确的方向上推动我,我也决定重构使用throws所以只有一个成功路径,所有其他路径都使用.catch,从而避免在发送之后更改res问题。主代码现在看起来像这样:
useradd: function (req, res) {
return db.users.findbyemail(req.body.email)
.then(function(data){
return module.exports.validateUser(data, req);
})
.then(function(){
return db.users.add({
provider: 'local',
email: req.body.email,
password: req.body.password,
salt: 'salt',
displayName: req.body.displayName })
})
.then(function(){
res.json({
success: true,
data: "Account created"
})
return "acct created";
})
.catch(function(error){
res.json({
success: false,
error: error.message || error
})
})
},
validateUser: function(data, req) {
console.log("got to validateUser, data " + data + " req " + req);
if (typeof data !== 'undefined' && data !== null) {
throw new Error("Email address " + req.body.email + " is already registered on this site");
} else {
//validation goes here
return null;
}
},
//with the db.users.add function modified from the version in my comment to:
add: (values) => {
var reponeres = rep.one(sql.add, values);
return reponeres;
},