Ошибка при входе в систему 402 (требуется оплата) - PullRequest
1 голос
/ 22 марта 2020

Я не понимаю этого. Я не могу войти. Пользователь уже находится в моей базе данных, и когда я вхожу в систему, он просто говорит:

POST http://localhost:3000/api/v1/users/login 402 (Payment Required)

Когда я регистрируюсь в первый раз, а затем войти в систему, Войти успешно Если я выхожу из системы, а затем пытаюсь войти в систему с тем же адресом электронной почты и паролем, я получаю вышеуказанную ошибку. Я даже не использую чей-то API. Это мой собственный созданный. Он посылает мне ответ "incorrect password"

Вот контроллер:

loginUser: (req, res, next) => {
    const { email, password } = req.body

    if (!email || !password) {
        return res.status(400).json({ message: "Email and password are must" })
    }

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

User model

const mongoose = require("mongoose")
const bcrypt = require("bcrypt")
const Schema = mongoose.Schema

const userSchema = new Schema({
    username: { type: String, required: true },
    email: { type: String, reuired: true },
    password: { type: String, required: true },
    posts:[{ type: Schema.Types.ObjectId, ref: "Post" }]
}, { timestamps: true })


userSchema.pre("save", function (next) {
    if (this.password) {
        const salt = bcrypt.genSaltSync(10)
        this.password = bcrypt.hashSync(this.password, salt)
    }
    next()
})

userSchema.methods.confirmPassword = function (password) {
    return bcrypt.compareSync(password, this.password)
}

const User = mongoose.model("User", userSchema)

module.exports = User

registration controller

    registerUser: (req, res) => {
        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 })
            }
        })
    }

Edit

loginUser: async (req, res, next) => {
    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" })
        } 
    })
}

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

1 Ответ

1 голос
/ 24 марта 2020

Возможно, вы захотите реорганизовать ваш код так, чтобы вы выполняли операции bcrypt в контроллере, а не в модели. Вы проверяете this.password после того, как пользователь обновляется (создает новые сообщения), и поскольку this является пользователем, приведенный ниже код выполняется каждый раз, когда вы обновляете объект пользователя.

if (this.password) {
        const salt = bcrypt.genSaltSync(10)
        this.password = bcrypt.hashSync(this.password, salt)
}

Таким образом, ваш хэширование его каждый раз, когда вы обновляете пользователя (создайте сообщение). Вместо этого удалите приведенный выше код из userSchema.pre(...) и попробуйте выполнить хеширование bcrypt, только когда пользователь first зарегистрировался.


registerUser: (req, res) => {
        var { username, email, password } = req.body
        if (password) {
           const salt = bcrypt.genSaltSync(10)
           password = bcrypt.hashSync(password, salt)
        }
        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 })
            }
        })
    }

Таким образом, хеширование происходит только один раз на создание пользователя и должно оставаться согласованным во всех других операциях.

Что касается ошибки Can't set headers after they are sent, возможно, вы отправляете ответ дважды, поскольку кажется, что ошибка исходит от контроллера posts. Скорее всего, вы отправляете ответ пользователя и ответ. Может быть, не отправлять ответ сообщений, так как вы будете отправлять его в ответе пользователя.

Подробнее об ошибке здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...