Обновить данные в базе данных с помощью Mongoose - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь обновить данные в моей базе данных с понедельника goose и NodeJS. Я уже могу получить данные от пользователя, вошедшего в систему, но он не позволяет мне обновляться. В моем интерфейсе я отображаю форму, которая получает данные от зарегистрированного пользователя (views / pages / profile-edit.e js) .

В файле внутреннего пользователя. js У меня есть такой файл:

    .get('/profile-edit',  auth, (req, res) => { 
        try {
            const user = req.user
            res.render('pages/profile-edit', { user } ) 
        } catch (err) {
            res.status(500).send(err)
        }
    })
    .post('/profile-edit', auth, async (req, res) => {
        try {
            const user = req.user
            await user.findOneAndUpdate()
            res.redirect('/profile')
        } catch (err) {
            res.status(500).send(err)
        }
    })

В .post я сохраняю зарегистрированного пользователя в const user. В await user.findOneAndUpdate я пытаюсь обновить, но я ничего не делаю. Я получил только перенаправление на страницу своего профиля. Я не получаю никакой ошибки, но данные не обновляются в базе данных.

Это моя модель Mon goose:

const userSchema = new mongoose.Schema({
    firstname: {
        type: String,
        required: true
    }, 
    surname: {
        type: String,
        required: true
    }, 
    age: {
        type: Number,
        required: true
    }, 
    gender: {
        type: String,
        required: true
    }, 
    club: {
        type: String,
        required: true
    }, 
    image: {
        type: String,
        required: true
    }, 
    email: {
        type: String,
        required: true
    }, 
    password: {
        type: String,
        required: true
    }, 
    searchGender: {
        type: String,
        required: true
    }, 
    description: {
        type: String,
        required: false
    }, 
    tokens: [{
        token: {
            type: String,
            require: true
        }
    }]
})

// SOURCE : https://medium.com/swlh/jwt-authentication-authorization-in-nodejs-express-mongodb-rest-apis-2019-ad14ec818122
// This code is running bevore we save the object to the database. Here we hash the password with the package bcrypt.
userSchema.pre('save', async function (next) {
    const user = this
    if(user.isModified('password')){
        user.password = await bcrypt.hash(user.password, 8)
    }
    next()
})

// Here we create a token with JWT. The sign expects data that will be used to sign the token. 
// Once the token created save it to the list of tokens and return the token. 
userSchema.methods.generateAuthToken = async function() {
    const user = this
    const token = jwt.sign ({_id: user._id}, process.env.JWT_KEY)
    user.tokens = user.tokens.concat({token})
    await user.save()
    return token
}

// Here we search for the User we expext 2 parameters email & password. First search for the user by email, if we can't find it throw an error.
// If it is found we compare the password with the hashed password in the database. 
userSchema.statics.findByCredentials = async (email, password) => {
    const user = await User.findOne({ email })
    if (!user) {
        throw new Error({ error: 'Geen geldig emailadres gevonden in de database' })
    }
    const isPasswordMatch = await bcrypt.compare(password, user.password)
    if (!isPasswordMatch) {
        throw new Error({ error: 'Wachtwoord klopt niet' })
    }
    return user
}

// Here we create the model called User and bind it to the userSchema then we export it. 
const User = mongoose.model('User', userSchema)

module.exports = User

Это ссылка на мой репозиторий на GitHub, поэтому вы можете просмотреть весь код GitHub Repo

Заранее спасибо.

Ответы [ 2 ]

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

Следующая строка проблемна c:

await user.findOneAndUpdate()

Поскольку findOneAndUpdate - это метод самой модели (в данном случае Пользователь). Также, чтобы иметь возможность использовать метод findOneAndUpdate, вам нужен фильтр и объект обновления, чтобы он мог найти документ с заданным фильтром и обновить его содержимое с помощью объекта обновления, например:

User.findOneAndUpdate({username: ".."}, {firstname: "..."} );

У вас уже есть пользовательский документ, который передается в req.user, поэтому я думаю, что вы можете просто обновить его поля и использовать метод save () .

.post('/profile-edit', auth, async (req, res) => {
  try {
      const user = req.user;

      user.firstname = req.body.firstname; // this is just a sample, you may need to change it

      await user.save();
      res.redirect('/profile')
  } catch (err) {
      res.status(500).send(err)
  }
})

Если это не так не работает, вы можете попробовать использовать метод findByIdAndUpdate следующим образом:

.post('/profile-edit', auth, async (req, res) => {
  try {
      const user = req.user;

      await User.findByIdAndUpdate(user._id, {
          firstname: req.body.firstname
      })

      res.redirect('/profile')
  } catch (err) {
      res.status(500).send(err)
  }
})
0 голосов
/ 21 марта 2020
 await User.findByIdAndUpdate(user._id, {
          firstname: req.body.firstname},
          {new: true}
 )

Новая опция обеспечивает возврат измененного документа, а не оригинала. По умолчанию для нового установлено значение false, поэтому не пропустите это.

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