不使用 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 数据库 [关闭]

使用 MEAN 堆栈的 Google Oauth 实现

Mongodb + SpringBoot REST API + Docker Compose 不工作

从客户端控制器 (MEAN.JS) 指定 Mongo 查询参数

MEAN框架的纯后端代码

将 djongo (Mongo ORM) 集成到 Django Rest 框架中