【发布时间】: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