Javascript 无法调用从函数中返回的承诺

Javascript 无法调用从函数中返回的承诺,javascript,node.js,express,es6-promise,Javascript,Node.js,Express,Es6 Promise,我在中间件文件中有一个名为setSignedInUser的函数,它接收一个cookie作为参数。我想用cookie查找保存在SignedIn集合中的用户,检索用户的唯一id,从Users集合中搜索用户的完整信息,并返回我想在调用函数的另一个文件中访问的foundUser 中间件文件: const { resolve } = require('path'); const User = require('./Models/User'), SignedIn = require('./Mod

我在中间件文件中有一个名为
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文件调用此函数

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})
});
但是在这里我得到一个错误,说
不能调用。然后在未定义的


我错过了什么?谢谢你

我想这是因为你把新的
承诺
放在你的第二级
承诺
里面了

尝试以异步方式传递
User.findOne
,如下所示:

module.exports={
SetSignedUser:(cookie)=>{
SignedIn.findOne({secretToken:cookie})
.然后(异步foundSignIn=>{
userId=foundSignIn.userId;
const foundUser=await User.findOne({u id:userId})
如果(用户){
返回用户;
}否则{
返回承诺。拒绝(“错误”}
}
})
.catch(错误=>{
console.log(错误)
})
}
}

您没有从
setSignedInUser
函数返回任何内容,因此
foundUser
未定义的

module.exports={
SetSignedUser:(cookie)=>{
返回新承诺((解决、拒绝)=>{
芬顿签名({
秘密令牌:cookie
})
.然后((foundSignIn)=>{
userId=foundSignIn.userId;
User.findOne({
_id:userId
})
。然后((foundUser)=>{
如果(用户){
解决(用户);
}否则{
拒绝(“错误”);
}
})
.catch((错误)=>{
控制台日志(err);
拒绝(错误);
});
})
.catch((错误)=>{
控制台日志(err);
拒绝(错误);
});
});
},
};

因为您需要内部函数的结果,所以可以返回一个承诺并用内部值解决它。

我不确定,但我认为您应该试试这个, 尝试像这样更改函数声明:

只需将
替换为
=

setSignedInUser = (cookie)=>{

}

谢谢,成功了:)