尝试使用猫鼬更新 mongodb 中的记录。我的应用程序使用 Node.js 和 Express 4
Trying to update record in mongodb using mongoose. My application is using Node.js and Express 4
我正在构建 Web 应用程序来跟踪棒球 players.The 当前与球员关联的唯一数据属性是 fName 和 lName。我正在使用 Node.js Express 4、mongoose 和 Jade。当你点击一个播放器时,我的 get 请求正常运行,它将带你到 localhost:3000/player/:id,播放器信息正确加载到 view.I 我的 post 有问题] 方法并让它在提交时实际更新玩家信息。我的 post 方法不是更新播放器,而是添加一个新播放器。
这里是 get 请求的代码,似乎运行正常:
router.get('/:id', function(req,res){
Player.find({_id: req.params.id}, function(err, player){
if(err){
res.redirect('/error');
}else{
res.render(
'editPlayer',
player[0]
);
}
});
});
这是 post 创建新播放器而不更新当前播放器的代码:
router.post('/:id', function(req,res){
Player.where({ _id: req.params.id }).update({ fName: req.body.fName, lName: req.body.lName });
res.redirect('player');
});
这里是 editPlayer.jade,其中包含我用来更新播放器的表单:
extends layout
block content
block content
h1 #{fName} #{lName}
form(method="post" action="/#{_id}")
input(type="hidden" value=_id name="id")
label(for="fName") First Name:
input(type="text", name="fName", value=fName)
label(for="lName") Last Name:
input(type="text", name="lName", value=lName)
input(type="submit", value="Save")
如果有更多有用的信息,请告诉我。感谢您提前抽出时间,
-弗雷德·克
让我们看看...您不想在路由器代码中调用 findOne() 而不是 find() 吗?
这可能只是你需要将 req.params.id 与 req.body.id 交换,顺便说一句。
您可以在 POST 中尝试这种样式...(例如,注意此处使用 req.body.id 而不是 req.param.id)
router.post('/:id', function(req,res) {
Player.findOne({})
.where('_id').equals(req.body.id)
.exec(function(err, playerRecord) {
if (playerRecord) {
playerRecord.fName = req.body.fName;
playerRecord.lName = req.body.lName;
playerRecord.save();
console.log('player/:id replace successful with Player record');
} else {
console.log('POST player/:id err');
} // End of if (playerRecord)
res.redirect('player');
}); // End of Player.findOne
}); // End of router.post
我正在构建 Web 应用程序来跟踪棒球 players.The 当前与球员关联的唯一数据属性是 fName 和 lName。我正在使用 Node.js Express 4、mongoose 和 Jade。当你点击一个播放器时,我的 get 请求正常运行,它将带你到 localhost:3000/player/:id,播放器信息正确加载到 view.I 我的 post 有问题] 方法并让它在提交时实际更新玩家信息。我的 post 方法不是更新播放器,而是添加一个新播放器。
这里是 get 请求的代码,似乎运行正常:
router.get('/:id', function(req,res){
Player.find({_id: req.params.id}, function(err, player){
if(err){
res.redirect('/error');
}else{
res.render(
'editPlayer',
player[0]
);
}
});
});
这是 post 创建新播放器而不更新当前播放器的代码:
router.post('/:id', function(req,res){
Player.where({ _id: req.params.id }).update({ fName: req.body.fName, lName: req.body.lName });
res.redirect('player');
});
这里是 editPlayer.jade,其中包含我用来更新播放器的表单:
extends layout
block content
block content
h1 #{fName} #{lName}
form(method="post" action="/#{_id}")
input(type="hidden" value=_id name="id")
label(for="fName") First Name:
input(type="text", name="fName", value=fName)
label(for="lName") Last Name:
input(type="text", name="lName", value=lName)
input(type="submit", value="Save")
如果有更多有用的信息,请告诉我。感谢您提前抽出时间, -弗雷德·克
让我们看看...您不想在路由器代码中调用 findOne() 而不是 find() 吗?
这可能只是你需要将 req.params.id 与 req.body.id 交换,顺便说一句。
您可以在 POST 中尝试这种样式...(例如,注意此处使用 req.body.id 而不是 req.param.id)
router.post('/:id', function(req,res) {
Player.findOne({})
.where('_id').equals(req.body.id)
.exec(function(err, playerRecord) {
if (playerRecord) {
playerRecord.fName = req.body.fName;
playerRecord.lName = req.body.lName;
playerRecord.save();
console.log('player/:id replace successful with Player record');
} else {
console.log('POST player/:id err');
} // End of if (playerRecord)
res.redirect('player');
}); // End of Player.findOne
}); // End of router.post