为什么我的更新用户模型路由不起作用(mongodb)?

时间:2017-04-06 11:52:22

标签: mongodb express mongoose routes

更新:几天前发布这个,我没有设法得到答案。有人能帮忙吗?无法解决为什么我收到此错误:'无法设置属性'username'为null。似乎我正在运行以捕获当前用户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
});

基本上,我希望用户在输入字段中重新输入params,单击确认并重定向回到已更新模式的/ blogs。

我开始写这条路线,但老实说在第一线就丢了。我已经为动态生成的元素创建了更新路由(评论,博客),但这似乎与我在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

非常担心这里出了什么问题!

1 个答案:

答案 0 :(得分:0)

您需要做的是首先通过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()
}}
)});

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

祝你好运