我正在尝试更新MongoDB中的实例化模型('Place' - 我知道它可以在其他路由中工作)并且花了一些时间尝试正确地执行此操作。我还试图重定向回查看“地点”的页面以查看更新的属性。
节点v0.4.0,Express v1.0.7,Mongoose 1.10.0
架构:
var PlaceSchema = new Schema({
name :String
, capital: String
, continent: String
});
控制器/路线:
app.put('/places/:name', function(req, res) {
var name = req.body.name;
var capital = req.body.capital;
var continent = req.body.continent;
Place.update({ name: name, capital: capital, continent: continent}, function(name) {
res.redirect('/places/'+name)
});
});
我尝试了很多不同的方法,但似乎无法得到它 另外,我不是如何声明阻止进一步操作的三个{name,capital和continent}变量?谢谢。一般调试帮助也很感激。 Console.log(名称)(在声明下面)不记录任何内容。
玉形式:
h1 Editing #{place.name}
form(action='/places/'+place.name, method='POST')
input(type='hidden', name='_method', value='PUT')
p
label(for='place_name') Name:
p
input(type='text', id='place_name', name='place[name]', value=place.name)
p
label(for='place_capital') Capital:
p
input(type='text', id='place_capital', name='place[capital]', value=place.capital)
p
label(for='place_continent') Continent:
p
textarea(type='text', id='place_continent', name='place[continent]')=place.continent
p
input(type="submit")
答案 0 :(得分:37)
您必须在更新任何内容之前找到该文档:
Place.findById(req.params.id, function(err, p) {
if (!p)
return next(new Error('Could not load Document'));
else {
// do your updates here
p.modified = new Date();
p.save(function(err) {
if (err)
console.log('error')
else
console.log('success')
});
}
});
使用您拥有的相同设置在生产代码中为我工作。您可以使用mongoose提供的任何其他find方法,而不是findById。只需确保在更新之前获取文档。
答案 1 :(得分:21)
现在,我认为你可以这样做:
Place.findOneAndUpdate({name:req.params.name}, req.body, function (err, place) {
res.send(place);
});
你也可以通过id找到:
Place.findOneAndUpdate({_id:req.params.id}, req.body, function (err, place) {
res.send(place);
});
答案 2 :(得分:4)
现在您可以通过id直接查找和更新,这是针对Mongoose v4
Place.findByIdAndUpdate(req.params.id, req.body, function (err, place) {
res.send(place);
});
请注意,如果您需要更新对象,则需要传递{new: true}
Place.findByIdAndUpdate(req.params.id, req.body, {new: true}, function (err, place) {
res.send(place);
});
答案 3 :(得分:0)
我认为你的问题是你正在使用节点0.4.0 - 尝试移动到0.2.6,它应该工作。在github上记录了一个问题,bodyDecoder没有填充节点> = 0.3.0中的req.body.variable字段。
答案 4 :(得分:0)
我的解决方案:model.js
const mongoose = require('mongoose')
constvalidator = require('validator')
const User = mongoose.model('User',{
名称:{
类型:字符串,
必填:是
修剪:是
}, 电子邮件:{
类型:字符串,
必填:是
trim:是,
小写:true,
验证(值){
如果(!validator.isEmail(value)){
引发新错误(“电子邮件无效”)
}}},
密码:{
类型:字符串,
必填:是
最小长度:7
trim:是,
验证(值) { 如果(value.toLowerCase()。includes('password')){
抛出新错误(“密码不能包含“密码””) } } }, 年龄:{ 类型:数字, 默认值:0, validate(value){
如果(值<0){
抛出新错误(“年龄必须为正数”)
}}}})
module.exports =用户
controller.js
exports.updateUser = async(req, res) => { const updates = Object.keys(req.body) const allowedUpdates = ['name', 'email', 'password', 'age'] const isValidOperation = updates.every((update) => allowedUpdates.includes(update)) if (!isValidOperation) { return res.status(400).send('Invalid updates!') } try { const user = await UserModel.findByIdAndUpdate(req.params.id, req.body, { new: true, runValidators: true }) if (!user) { return res.status(404).send() } res.status(201).send(user) } catch (error) { res.status(400).send(error) } }
**router.js**
router.patch('/task/:id', taskController.updateTask)