Я очень новичок в 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> </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){
});
});



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


в вашей требуемой модели пользователя сделайте это так
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);
});
}
Здравствуйте, что нам делать, если мы не уверены, что req.body будет содержать поле имени для обновления, но оно может содержаться в некоторых случаях. Просто, как проверить, какие поля отправляются через req.body, нам нужно только обновить эти поля, другие поля останутся такими же, как и старые.
вы можете сделать console.info(req.body) и посмотреть, что включено в тело, и действовать соответственно
Спасибо, это сработало! вроде ... Теперь, когда я нажимаю «Сохранить изменения», страница профиля загружается, но со старой информацией. Когда я обновляю его, отображается недавно измененная информация.