如何解决无法调用从函数内返回的承诺
我在中间件文件中有一个名为 setSignedInUser
的函数,它接收一个 cookie 作为参数。我想用 cookie 查找保存在 SignedIn
集合中的用户,检索用户的唯一 id,从 Users
集合中搜索用户的完整信息并返回我想要的 foundUser
喜欢在调用该函数的另一个文件中访问。
中间件文件:
const { resolve } = require('path');
const User = require('./Models/User'),SignedIn = require('./Models/SignedIn');
module.exports = {
setSignedInUser : (cookie)=>{
console.log(cookie)
SignedIn.findOne({secretToken : cookie})
.then(foundSignIn=>{
userId = foundSignIn.userId;
User.findOne({_id : userId})
.then(foundUser=>{
console.log(foundUser) // User is successfully found and loged to the console
return new Promise((resolve,reject)=>{
if(foundUser){
resolve(foundUser);
}else{
reject('error')
}
})
})
.catch(err=>{
console.log(err)
})
})
.catch(err=>{
console.log(err)
})
}
}
index.js 文件:
const middleware = require('../middleware');
router.get('/',(req,res)=>{
middleware.setSignedInUser(req.cookies.auth_cook)
.then(foundUser=>{
console.log(foundUser)
})
.catch(err=>{
console.log(err)
})
res.render('../views/general/home.ejs',{user : user})
});
但在这里我收到一条错误消息 Cannot call .then on undefined
我在这里错过了什么?谢谢你
解决方法
您没有从 setSignedInUser
函数返回任何内容,因此 foundUser
是 undefined
。正确的方法是这样的:
module.exports = {
setSignedInUser: (cookie) => {
return new Promise((resolve,reject) => {
SignedIn.findOne({
secretToken: cookie
})
.then((foundSignIn) => {
userId = foundSignIn.userId;
User.findOne({
_id: userId
})
.then((foundUser) => {
if (foundUser) {
resolve(foundUser);
} else {
reject('error');
}
})
.catch((err) => {
console.log(err);
reject(err);
});
})
.catch((err) => {
console.log(err);
reject(err);
});
});
},};
因为你想要一个内部函数的结果,你可以返回一个 Promise 并用内部值解析它。
,我认为这是因为您在第二级 promise
中返回了新的 promise
。
尝试像这样在异步中传递 User.findOne
:
module.exports = {
setSignedInUser : (cookie)=>{
SignedIn.findOne({secretToken : cookie})
.then(async foundSignIn=>{
userId = foundSignIn.userId;
const foundUser = await User.findOne({_id : userId})
if(foundUser){
return foundUser;
} else {
return Promise.reject("error"}
}
})
.catch(err=>{
console.log(err)
})
}
}
,
我不确定,但我认为你应该试试这个, 尝试像这样更改函数的声明。 :
只需将 :
替换为 =
setSignedInUser = (cookie)=>{
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。