不使用 API REST MEAN + Mongoose 中的方法“UPDATE”
Posted
技术标签:
【中文标题】不使用 API REST MEAN + Mongoose 中的方法“UPDATE”【英文标题】:Not working with method "UPDATE" in API REST MEAN + Mongoose 【发布时间】:2016-12-19 22:07:08 【问题描述】:exports.updateUsuarioByEmail = function (req, res)
console.log('updateUsuarioByEmail');
console.log("PARAM ID" + req.params.email);
return Usuario.find( email: req.params.email , function(err, usuario)
if(!usuario)
res.statusCode = 404;
return res.send( error: 'Not found' );
if (req.body.email != null) usuario.email = req.body.email;
if (req.body.password != null) usuario.password = req.body.password;
if (req.body.listaCardsSorting != null) usuario.listaCardsSorting = req.body.listaCardsSorting;
return usuario.save(function(err)
if(!err)
console.log('Updated usuario');
return res.send( status: 'OK', usuario:usuario );
else
if(err.name == 'ValidationError')
res.statusCode = 400;
res.send( error: 'Validation error' );
else
res.statusCode = 500;
res.send( error: 'Server error' );
console.log('Internal error(%d): %s',res.statusCode,err.message);
res.send(usuario);
);
);
;
执行后的错误是:
我认为错误是"return usuario.save(function(err)..."
这一行
【问题讨论】:
【参考方案1】:这里仍然是解决方案:
exports.updateUsuarioByEmail = function (req, res)
console.log('updateUsuarioByEmail');
return Usuario.findOne(email: req.params.email, function (err, usuario)
usuario.email = req.body.email || usuario.email;
usuario.password = req.body.password || usuario.password;
usuario.listaCardsSorting = req.body.listaCardsSorting || usuario.listaCardsSorting;
return usuario.save(function (err)
if (!err)
console.log('Updated');
return res.send(status: 'OK', usuario: usuario);
else
if (err.name == 'ValidationError')
res.statusCode = 400;
res.send(error: 'Validation error');
else
res.statusCode = 500;
res.send(error: 'Server error');
console.log('Internal error(%d): %s', res.statusCode, err.message);
res.send(usuario);
);
);
;
【讨论】:
【参考方案2】:要更新模型,使用 findOneAndUpdate()
更新 API 要容易得多。该方法找到一个匹配的文档,根据更新参数更新它,传递任何选项,并将找到的文档(如果有的话)返回给回调。如果回调通过,查询会立即执行。
语法是:
Model#findOneAndUpdate([conditions], [doc], [options], [callback])
参数:
[conditions] <Object> - the query to match
[doc] <Object> - the document to update
[options] <Object> - update options
[callback] <Function> - callback
例如,上面的函数可以重写为使用findOneAndUpdate()
方法为:
exports.updateUsuarioByEmail = function (req, res)
console.log('updateUsuarioByEmail');
console.log("PARAM ID" + req.params.email);
var doc = ,
conditions = "email": req.params.email ,
options = "new": true ;
if (req.body.email != null) doc.email = req.body.email;
if (req.body.password != null) doc.password = req.body.password;
if (req.body.listaCardsSorting != null)
doc.listaCardsSorting = req.body.listaCardsSorting;
Usuario.findOneAndUpdate(
conditions,
doc,
options,
function(err, usuario)
if(!err)
console.log('Updated usuario');
return res.send(
status: 'OK',
usuario: usuario
);
else
if(err.name == 'ValidationError')
res.statusCode = 400;
res.send( error: 'Validation error' );
else
res.statusCode = 500;
res.send( error: 'Server error' );
console.log('Internal error(%d): %s',res.statusCode,err.message);
)
;
【讨论】:
【参考方案3】:find
返回一个 Array (list of documents)
。你不能在数组对象上做save
。如果您的 email
字段是 unique
,请尝试使用 findOne
。
findOne
返回一个 document
,所以你可以 save
那个。
替换
Usuario.find( email: req.params.email , function(err, usuario)
与:
Usuario.findOne( email: req.params.email , function(err, usuario)
【讨论】:
以上是关于不使用 API REST MEAN + Mongoose 中的方法“UPDATE”的主要内容,如果未能解决你的问题,请参考以下文章
如何为 REST API 构建 Mongo 数据库 [关闭]
Mongodb + SpringBoot REST API + Docker Compose 不工作