[英]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.
我怀疑在您的情况下可能发生的情况是您尝试在 updateUser 方法完成从数据库检索数据之前读取“用户”的值。
I suggest you to look into nodeJS promises & the await async syntax我建议你看看 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.这里发生的是 updateUser 方法现在返回一个 Promise,可以使用 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()
当您调用
resolve()
时 promise 结束,它会抛出reject()
异常
The returned data by the asynchronous function is sent as the parameter for the resolve()
callback.异步 function 返回的数据作为
resolve()
回调的参数发送。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.