回调和承诺:无法读取未定义的 属性 'then'
Callback and Promises : cannot read property 'then' of undefined
我正在尝试编写一些代码并且它可以工作,但是我 运行 遇到了 bcrypt
使用回调的问题,我正在尝试用承诺解决它。这是代码:
`UserSchema.statics.findByData = function(username,password) {
var User = this;
User.findOne({username}).then((user) => {
if(!user){
return Promise.reject();
}
return new Promise((resolve,reject) => {
bcrypt.compare(password,user.password,(err,res) => {
if(res){
resolve(user);
}else {
reject();
}
});
});
});
};`
我从这里调用这个函数:
User.findByData(body.username,body.password).then((user) => {
res.send(user);
}).catch((e) => {
res.status(400).send();
});
我收到一个错误:`无法读取未定义的 属性 'then '。
为什么会出现这个错误?
如第一条评论所述,您需要 return User.findOne
,即 promise
。所以不需要创建另一个 promise
。无论何时 return,then
都将使用 returned 值调用。您也可以使用 Promise.reject()
和 Promise.resolve()
分别调用 catch
和 then
。
UserSchema.statics.findByData = function(username,password) {
var User = this;
return User.findOne({username}).then((user) => {
if(!user){
Promise.reject('No user found');
}
bcrypt.compare(password,user.password,(err,res) => {
if(res){
Promise.resolve(user);
}else {
Promise.reject(err);
}
});
});
};
我正在尝试编写一些代码并且它可以工作,但是我 运行 遇到了 bcrypt
使用回调的问题,我正在尝试用承诺解决它。这是代码:
`UserSchema.statics.findByData = function(username,password) {
var User = this;
User.findOne({username}).then((user) => {
if(!user){
return Promise.reject();
}
return new Promise((resolve,reject) => {
bcrypt.compare(password,user.password,(err,res) => {
if(res){
resolve(user);
}else {
reject();
}
});
});
});
};`
我从这里调用这个函数:
User.findByData(body.username,body.password).then((user) => {
res.send(user);
}).catch((e) => {
res.status(400).send();
});
我收到一个错误:`无法读取未定义的 属性 'then '。
为什么会出现这个错误?
如第一条评论所述,您需要 return User.findOne
,即 promise
。所以不需要创建另一个 promise
。无论何时 return,then
都将使用 returned 值调用。您也可以使用 Promise.reject()
和 Promise.resolve()
分别调用 catch
和 then
。
UserSchema.statics.findByData = function(username,password) {
var User = this;
return User.findOne({username}).then((user) => {
if(!user){
Promise.reject('No user found');
}
bcrypt.compare(password,user.password,(err,res) => {
if(res){
Promise.resolve(user);
}else {
Promise.reject(err);
}
});
});
};