Как обновить существующие пользовательские данные в приложении node.js и MongoDB с помощью почтовой формы ejs?

Я очень новичок в javascript и нашел видео Брэда Траверси Node.js с проверкой подлинности паспорта и следил за его видео до t.

Это сработало для меня, но потом я хотел добавить больше. Я создал пользовательскую панель управления и навигацию. Одна страница, которую я добавил, была страницей профиля пользователя. Я добавил это, потому что хочу иметь возможность обновлять информацию о пользователе, если это возможно.

Теперь я застрял. Я думаю, что у меня проблема с моей функцией .findOneAndUpdate, которую я поместил в свой маршрут index.js. Возможно, я неправильно использую функцию. В настоящее время я веду консольный журнал req.body.name, а также req.user.name.

req.body.name — это то, что пользователь вводит в качестве нового имени, req.user.name — исходное имя.

верх и низ index.js

const express = require('express');
const router = express.Router();
const { ensureAuthenticated } = require('../config/auth');
const mongoose = require('mongoose');
require('../models/User');
const User = mongoose.model('User');  

router.post('/', (req, res) => {
    updateRecord(req, res);
});

function updateRecord(req, res) {
User.findOneAndUpdate({ "_id": req.body._id },{
    $set: {
        "name": req.body.name
    }
 }, { new: true }, (err, doc) => {
    if (!err) { 

        console.info(req.user.name);
        console.info(req.body.name);
        res.redirect('/profile'); 
    }
    else {
        console.info('Error during record update : ' + err);
    }
 });
}



module.exports = router;

edit.ejs

<form action = "./profile" method = "POST">
<div class = "form-group">
    <label for = "">Full Name</label>
    <input type = "text" class = "form-control" value = "<%= name %>" 
name = "name"> 
</div>
<div class = "form-group" >
    <label for = "">email</label>
    <input type = "text" class = "form-control" value = "<%= email %>" readonly>
</div>
<div class = "form-row">
    <div class = "form-group">
        <button type = "submit" class = "btn btn-info"><a href = "profileEditor">  
</a> Save Changes</button>
    </div>
    <p>&nbsp; &nbsp;</p>
    <div class = "form-group">
        <button class = "btn btn-dismiss"><a href = "./profile">Exit</a> 
</button></a>
    </div>
</div>
</form>

User.js

const mongoose = require('mongoose');

const UserSchema = new mongoose.Schema({
name: {
type: String,
required: true
},
email: {
type: String,
required: true
},
password: {
type: String,
required: true
},
date: {
type: Date,
default: Date.now
}
});

const User = mongoose.model('User', UserSchema);

module.exports = User;

РЕДАКТИРОВАТЬ

Я следовал инструкциям THEWOLF, и теперь база данных обновляется! Однако теперь, когда я нажимаю кнопку «Сохранить изменения», она перенаправляется на страницу профиля, но отображает старое имя. Только когда вы обновляете страницу или уходите с нее, обновленное имя отображается на моем веб-сайте.

Вот новый код index.js

router.post('/', (req, res) => {
   updateRecord(req,res);
   res.redirect('/profile');

});

function updateRecord(req, res) {
User.findOne({_id:req.user.id},(err,doc)=>{
 //this will give you the document what you want to update.. then 
doc.name = req.body.name;
doc.save(function(err,doc){

});

 });
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
3 275
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

в вашей требуемой модели пользователя сделайте это так

const User=require('../models/User');

тогда

function updateRecord(req, res) {
User.findOne({_id:req.body.id},(err,doc)=>{
 //this will give you the document what you want to update.. then 
doc.name = req.body.name; //so on and so forth

// then save that document
doc.save(callback);

});

}

Спасибо, это сработало! вроде ... Теперь, когда я нажимаю «Сохранить изменения», страница профиля загружается, но со старой информацией. Когда я обновляю его, отображается недавно измененная информация.

tyler 31.01.2019 01:37

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

Sunil Shah 28.12.2021 09:13

вы можете сделать console.info(req.body) и посмотреть, что включено в тело, и действовать соответственно

ALPHA 28.12.2021 12:35

Другие вопросы по теме