简体   繁体   中英

i am creating a login- logut demo

when i am posting to my register route i am using following code to check the user in database but my destructor is showing user as undefined but i have defined the user

    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
            }
            })
        }
    }

this is my register method to register a user

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

the error i am getting

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

Database requests are asynchronous. What I suspect might be happening in your case is you try to read the value of 'user' before the updateUser method is done retrieving the data from the DB.

I suggest you to look into nodeJS promises & the await async syntax

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])
}

This is a possible solution to your error

What happens here is that the updateUser method now returns a Promise that can be handled using async/await.

Basically it enables us to tell the program, hey wait till this block of code finishes execution. The promise ends when u call resolve() , and it throws an exception with reject()

The returned data by the asynchronous function is sent as the parameter for the resolve() callback.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM