【问题标题】:How to update existing user data in a node.js and MongoDB app with ejs post form?如何使用 ejs 发布表单更新 node.js 和 MongoDB 应用程序中的现有用户数据?
【发布时间】:2019-06-23 05:17:47
【问题描述】:

我对 javascript 非常陌生,发现了 Brad Traversy 的带有 Passport Authentication 的视频 Node.js,并跟随他的视频观看了视频。

它对我有用,但后来我想添加更多。我创建了一个自定义仪表板和导航。我添加的一个页面是用户个人资料页面。我添加这个是因为我希望能够在可能的情况下更新用户的信息。

现在我被困住了。我认为我在路由 index.js 中放置的 .findOneAndUpdate 函数存在问题。我可能没有正确使用该功能。我目前正在控制台记录 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.log(req.user.name);
        console.log(req.body.name);
        res.redirect('/profile'); 
    }
    else {
        console.log('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>

用户.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 node.js mongodb mongoose mongoose-schema


    【解决方案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);
    
    });
    
    }
    

    【讨论】:

    • 谢谢,成功了!有点...现在,当我单击保存更改时,配置文件页面会加载但带有旧信息。当我刷新它时,会显示新更改的信息。
    • 您好,如果我们不确定 req.body 是否包含用于更新的名称字段但在某些情况下可能包含,我们该怎么办。简单来说,如何查看req.body发送了哪些字段,我们只需要更新那些字段,其他字段保持原样。
    • 你可以做console.log(req.body),看看body里面有什么内容并采取相应的行动
    猜你喜欢
    • 2019-10-12
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    相关资源
    最近更新 更多