微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决无法调用从函数内返回的承诺

我在中间件文件中有一个名为 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})
});

在这里我收到一条错误消息 Cannot call .then on undefined

在这里错过了什么?谢谢你

解决方法

您没有从 setSignedInUser 函数返回任何内容,因此 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);
        });
    });
  },};

因为你想要一个内部函数的结果,你可以返回一个 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] 举报,一经查实,本站将立刻删除。