【问题标题】:Not working with method "UPDATE" in API REST MEAN + Mongoose不使用 API REST MEAN + Mongoose 中的方法“UPDATE”
【发布时间】: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)..."这一行

【问题讨论】:

    标签: node.js mongodb rest express mongoose


    【解决方案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)
        

        【讨论】:

          猜你喜欢
          • 2014-12-23
          • 1970-01-01
          • 2020-06-04
          • 1970-01-01
          • 2020-06-21
          • 2015-10-31
          • 2019-06-27
          • 2017-12-29
          • 1970-01-01
          相关资源
          最近更新 更多