【问题标题】:Why is my update user model route not working (mongodb)?为什么我的更新用户模型路由不起作用(mongodb)?
【发布时间】:2017-09-01 10:34:22
【问题描述】:

更新:几天前发布了这个,我还没有得到答案。有人能帮忙吗?无法弄清楚为什么我会收到此错误:'无法设置属性'用户名'为空。似乎我正在运行以捕获当前用户 ID 的代码不起作用,但看不到我在哪里出错了。

我无法弄清楚为什么我的 mongodb 用户模型的更新路由不起作用。

所以很明显,这个想法是向用户呈现一个预先加载了他们当前用户详细信息的表单,然后他们可以编辑表单,它应该更新用户架构。

这是我的编辑个人资料表单:

<div class="row">
<div id="user-image-preview" class="col-md-4 col-sm-12 user-image-preview"> </div>
<div class ="reg-container-form col-md-8 col-sm-12">
<div class="jumbotron form"><h2><i class="fa fa-user-plus" aria-hidden="true"></i> Update profile</h2></div>
<form id="register" action = "/register" method="POST">
<div class="form-group has-feedback">
    <i class="fa fa-user" aria-hidden="true"></i>
    <label for="username">Username</label>
        <input id="username" type = "text" class = "form-control" value = "<%=currentUser.username%>" name="username"> 
</div>

<div class="form-group has-feedback">
    <i class="fa fa-envelope" aria-hidden="true"></i>
    <label for="email">Email</label>
        <input id="email" type = "email" class = "form-control" value = "<%=currentUser.email%>" name="email"> 
</div>

<div class="form-group">
    <div><i class="fa fa-picture-o" aria-hidden="true"></i>  <label for="img">Image</label></div>
        <input id="user-image-set" type = "text" class ="form-control" placeholder = "Enter image URL" name = "image">
          <a href="#"><div id="eye-button"><i id="preview-icon" class="fa fa-eye" aria-hidden="true"></i></div></a>
</div>

    <button id="submit-login" type ="submit" class="btn btn-primary btn-lg disabled">Confirm changes</button>
</form>
</div>
</div>

通过以下途径访问表单:

router.get("/profile", function(req, res){
res.render("profile")
})

用户架构是:

var UserSchema = new mongoose.Schema({
username: String,
password: String,
image: String,
email: String
});

所以本质上,我希望用户在输入字段中重新输入参数,单击确认并被重定向回 /blogs 并更新架构。

我开始写路线,但说实话在第一行就迷路了。我已经为动态生成的元素(cmets、博客)创建了更新路由,但这似乎与我通过 URL 中的 id 等传递的那些不同。不知道从哪里开始...

我尝试使用 findUserById 方法如下:

router.post("/update-user", function(req, res, next){
User.findByIdAndUpdate(req.body.user_id, req.body.user, function  (err,updatedUser){
    if(err){
        res.redirect("/profile")
        console.log(err);
    } else {
        res.redirect("/blogs");
    }
})
})

此代码运行良好(如重定向到 /blogs),但不更新模型。所以我尝试插入 updatedUser.save():

router.post("/update-user", function(req, res, next){
User.findByIdAndUpdate(req.body.user_id, req.body.user, function(err,updatedUser){
    if(err){
        res.redirect("/profile")
        console.log(err);
    } else {
        updatedUser.save();
        res.redirect("/blogs");
    }
})
})

这会产生以下错误:

TypeError: Cannot read property 'save' of null

然后我尝试更改代码以找到当前的 userId,如下所示(以下收到的建议):

router.post('/update-user',function (req,res,next){
User.findOne({_id: req.body._id},function (err,user){
if(err){
res.redirect("/profile")
} else {
user.username = req.body.username;
user.email = req.body.email;
user.image = req.body.image;
user.save()
}}
)});

这会产生以下错误:

TypeError: Cannot set property 'username' of null

非常纠结这里出了什么问题!

【问题讨论】:

    标签: mongodb express mongoose routes


    【解决方案1】:

    您需要做的是首先通过 Id 找到用户,然后只需传入新值即可。

    更新:

        router.post('/update-user',function (req,res,next){
    
    User.findOne({_id: req.body._id},function (err,user){
    if(err){
        res.redirect("/profile")
    } else {
    user.username = req.body.username;
    user.email = req.body.email;
    user.image = req.body.image;
    user.save()
    }}
    )});
    

    我只是简单地说,我相信你可以处理错误处理等。

    祝你好运

    【讨论】:

    • 为这个回复干杯!表单动作怎么样?这在我的 HTML 表单中看起来正确吗?
    • 是的,只要确保您的操作与您的 router.post 匹配即可。我不确定您是如何配置服务器的,但您可能还需要为表单使用 urlencoded enctype。
    • 您好,刚刚尝试使用 findByIdAndUpdate 方法实现更新路由(参见我上面的编辑),但它抛出了一个错误。老实说,我对更新路线的逻辑还是有点粗略。我通过更新 cmets 和其他动态生成的内容得到它,但由于某种原因,我在更新用户时画了一点空白
    • 您是否更改了表单操作以匹配此路线?您确定您已登录并在会话中有一个用户对象吗?
    • 是的,表单操作设置为
      我在尝试访问此路由时肯定已登录。我在原文中添加了我收到的错误消息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 2014-08-31
    • 1970-01-01
    相关资源
    最近更新 更多