Итак, я целый день чесал голову об этой проблеме. Мое приложение поддерживает регистрацию, вход, создание поста. Что я заметил, так это то, что пользователь, у которого нет сообщения, может в любое время успешно войти в систему. Но те, у кого есть сообщения, не могут войти после.
Вот как это выглядит.
case 1
I register with Jim -> jim is stored in the db -> login with jim(success) -> logout(works fine) and again login(works fine)
case 2
I register with Jim -> jim is stored in the db -> login with jim(success) -> makes a post -> post shows in his feed(success) -> logout(works fine) and again try to login(failed)
Ошибка ->
POST http://localhost:3000/api/v1/users/login 402 (Payment Required)
Это даже не входит в контроллер входа, когда пользователь, у которого есть сообщение (ы) попробуйте войти. Он успешно работает для пользователя, у которого нет сообщений. Это меня смущает.
Вот код:
registerUser: (req, res) => {
console.log("inside register user")
const { username, email, password } = req.body
User.create(req.body, (err, createdUser) => {
if (err) {
return res.status(500).json({ error: "Server error occurred" })
} else if (!username || !email || !password) {
return res.status(400).json({ message: "Username, email and password are must" })
} else if (!validator.isEmail(email)) {
return res.status(400).json({ message: "Invaid email" })
} else if (password.length < 6) {
return res.status(400).json({ message: "Password should be of at least 6 characters" })
}
else {
return res.status(200).json({ user: createdUser })
}
})
},
loginUser: async (req, res, next) => {
console.log("inside login controller")
const { email, password } = req.body
if (!email || !password) {
return res.status(400).json({ message: "Email and password are must" })
}
await User.findOne({ email }, (err, user) => {
if (err) {
return next(err)
} else if (!validator.isEmail(email)) {
return res.status(400).json({ message: "Invalid email" })
} else if (!user) {
return res.status(402).json({ error: "User not found" })
} else if (!user.confirmPassword(password)) {
return res.status(402).json({ error: "incorrect password" })
}
// generate token here
const token = auth.signToken({ userId: user._id })
// const token = auth.signToken({ email })
res.status(200).json({ user, token })
// next()
})
}
newPost controller
newPost: (req, res) => {
const data = {
title: req.body.title,
content: req.body.content,
user: req.user.userId
}
Post.create(data, (err, newPost) => {
if (err) {
return res.status(500).json({ error: err })
} else if (!newPost) {
return res.status(400).json({ message: "No Post found" })
} else if (newPost) {
User.findById(req.user.userId, (err, user) => {
user.posts.push(newPost._id) //pushing posts documnet objectid to the post array of the user document
user
.save()
.then(() => {
return res.json(200).json({ user })
})
.catch(err => {
return res.status(500).json({ error: err })
})
})
}
})
}
Я также зарегистрировался в почтальоне, пройдя по маршруту /users/login
и введя адрес электронной почты и пароль, но там написано incorrect password
. Он возвращает возврат от
else if (!user.confirmPassword(password)) {
return res.status(402).json({ error: "incorrect password" })
}
Если я изменю вышеприведенное значение на ({ error: err})
, он возвращает ответ:
{
"error": null
}
Update
User.findById(req.user.userId, (err, user) => {
console.log("user before save", user)
user.gratitudes.push(newGratitude._id) //pushing posts documnet objectid to the post array of the user document
user
.save()
.then(() => {
// return res.json(200).json({ user })
console.log("user after saving", user)
})
.catch(err => {
return res.status(500).json({ error: err })
})
)
Итак, я сделал это и утешил
user before saving => { posts: [],
_id: 5e78c76381327761329b8dc6,
username: 'king123',
email: 'king123@gmail.com',
password: '$2b$10$CnWib5AMxw1qv5RnBdEisOXUq9X3lqqOMH3HWO3DlWf.iB2Ke8GLS',
createdAt: 2020-03-23T14:27:47.820Z,
updatedAt: 2020-03-23T14:27:47.820Z,
__v: 0 }
user after saving => { posts: [ 5e78c77a81327761329b8dc7 ],
_id: 5e78c76381327761329b8dc6,
username: 'king123',
email: 'king123@gmail.com',
password: '$2b$10$ro4FIO40.3Nwe52RFq/leepH906HvIHYW5A3XrTGfNXcUSIfsx0Bq',
createdAt: 2020-03-23T14:27:47.820Z,
updatedAt: 2020-03-23T14:28:10.290Z,
__v: 1 }
Похоже, хешированный пароль изменился.