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

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 任何内容,因此 foundUserundefined。正确的方法是这样的:

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)=>{

}