无法调用从函数内返回的承诺
Not able to call promise that is returned from within a function
我在名为 setSignedInUser
的中间件文件中有一个函数,它接收一个 cookie 作为参数。我想找到保存在 SignedIn
集合中的用户和 cookie,检索用户的唯一 ID,从 Users
集合和 return 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 文件中调用此函数。
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
我在这里错过了什么?谢谢
我认为这是因为你 return 新的 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
函数中 returning 任何内容,因此 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);
});
});
},
};
因为你想要一个内部函数的结果,你可以 return 一个 Promise 并用内部值解决它。
我不确定,但我认为你应该试试这个,
尝试像这样更改函数声明。 :
只需将 :
替换为 =
setSignedInUser = (cookie)=>{
}
我在名为 setSignedInUser
的中间件文件中有一个函数,它接收一个 cookie 作为参数。我想找到保存在 SignedIn
集合中的用户和 cookie,检索用户的唯一 ID,从 Users
集合和 return 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 文件中调用此函数。
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
我在这里错过了什么?谢谢
我认为这是因为你 return 新的 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
函数中 returning 任何内容,因此 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);
});
});
},
};
因为你想要一个内部函数的结果,你可以 return 一个 Promise 并用内部值解决它。
我不确定,但我认为你应该试试这个, 尝试像这样更改函数声明。 :
只需将 :
替换为 =
setSignedInUser = (cookie)=>{
}