Javascript 我正在创建一个登录日志演示

Javascript 我正在创建一个登录日志演示,javascript,node.js,Javascript,Node.js,当我发布到我的注册路径时,我使用以下代码检查数据库中的用户,但我的析构函数显示用户为未定义,但我已经定义了用户 updateUser(userDetails){ User.find({}, function (err, foundItems){ console.log(foundItems[0].email) const checkUserByEmail = foundItems.find((u)=> u.email

当我发布到我的注册路径时,我使用以下代码检查数据库中的用户,但我的析构函数显示用户为未定义,但我已经定义了用户

    updateUser(userDetails){
        User.find({}, function (err, foundItems){
            console.log(foundItems[0].email)
            const checkUserByEmail = foundItems.find((u)=> u.email === userDetails.email)
            console.log(checkUserByEmail)
            if(checkUserByEmail){
                console.log("adsakhdsk")
                return {
                    error : "user already exist"
                }
            }
            const user = new User({
                email : userDetails.email,
                password: userDetails.password
            })
            user.save()
            return {
                user : userDetails
            }
            })
        }
    }
这是我注册用户的注册方法

  register = (req, res) => {
    const userDetails = {
      email: req.body.email,
      password: req.body.password,
    }
    const { user , error } = usersdb.updateUser(userDetails)
    console.log([user , error])
}
我得到的错误

TypeError: Cannot destructure property 'user' of 'usersdb.updateUser(...)' as it is undefined.
    at register (C:\Users\USER\Desktop\nodejs\login-logut-demo\api\auth\router.js:13:13)
    at Layer.handle [as handle_request] (C:\Users\USER\Desktop\nodejs\login-logut-demo\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\USER\Desktop\nodejs\login-logut-demo\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\USER\Desktop\nodejs\login-logut-demo\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\USER\Desktop\nodejs\login-logut-demo\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\USER\Desktop\nodejs\login-logut-demo\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (C:\Users\USER\Desktop\nodejs\login-logut-demo\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\USER\Desktop\nodejs\login-logut-demo\node_modules\express\lib\router\index.js:275:10)
    at Function.handle (C:\Users\USER\Desktop\nodejs\login-logut-demo\node_modules\express\lib\router\index.js:174:3)
    at router (C:\Users\USER\Desktop\nodejs\login-logut-demo\node_modules\express\lib\router\index.js:47:12)
    at Layer.handle [as handle_request] (C:\Users\USER\Desktop\nodejs\login-logut-demo\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\USER\Desktop\nodejs\login-logut-demo\node_modules\express\lib\router\index.js:317:13)
    at C:\Users\USER\Desktop\nodejs\login-logut-demo\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (C:\Users\USER\Desktop\nodejs\login-logut-demo\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\USER\Desktop\nodejs\login-logut-demo\node_modules\express\lib\router\index.js:275:10)
    at C:\Users\USER\Desktop\nodejs\login-logut-demo\node_modules\body-parser\lib\read.js:130:5

数据库请求是异步的。 我怀疑在您的情况下可能发生的是,在updateUser方法从数据库检索数据之前,您尝试读取'user'的值

我建议您研究nodeJS&等待异步语法

updateUser(userDetails){
    return new Promise((resolve, reject) => {
        User.find({}, function (err, foundItems) {
            console.log(foundItems[0].email)
            const checkUserByEmail = foundItems.find((u) => u.email === userDetails.email)
            console.log(checkUserByEmail)
            if (checkUserByEmail) {
                console.log("adsakhdsk")
                resolve({
                    error: "user already exist"
                })
            }
            const user = new User({
                email: userDetails.email,
                password: userDetails.password
            })
            user.save()
            resolve({
                user: userDetails
            })
        })
    })
}


register = async (req, res) => {
    const userDetails = {
        email: req.body.email,
        password: req.body.password,
    }
    const { user, error } = await usersdb.updateUser(userDetails)
    console.log([user, error])
}
这是解决您的错误的可能方法

这里发生的是updateUser方法现在返回一个承诺,可以使用async/await处理该承诺

基本上,它使我们能够告诉程序,等这段代码执行完毕。 当您调用
resolve()
时,承诺结束,并抛出异常
reject()


异步函数返回的数据作为
resolve()
回调的参数发送。

从外观上看,您没有从
updateUser
返回任何内容,因此
usersdb.updateUser(userDetails)
正在解析为
未定义的
。此代码是否引发任何错误,或者当您登录时,
用户
只是
未定义
?@sandmann我添加了我得到的错误。我在items.find block中返回错误和用户nodeJS中的任何数据库查询都是异步的。我建议将updateUser方法封装到promise中,并使register成为一个异步函数实际上,
usersdb.updateUser(userDetails)
正在解析为
未定义的
。必须从
updateUser
方法返回具有
user
属性的对象。尝试返回
User.find的结果(如果返回任何内容)。