Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 更新所有用户数据节点JS Rest PUT_Node.js_Mongoose_Put - Fatal编程技术网

Node.js 更新所有用户数据节点JS Rest PUT

Node.js 更新所有用户数据节点JS Rest PUT,node.js,mongoose,put,Node.js,Mongoose,Put,我正在使用Nodejs和Mongo创建一个restapi。我对Node非常陌生,除了更新所有用户外,我还能够处理所有其他请求,如GET、POST、DELETE、PUT(针对单个用户) 我想更新所有用户的数据。下面是我的代码 import mongoose from 'mongoose'; import { Router } from 'express'; import User from '../model/user'; import bodyParser from 'body-parser';

我正在使用Nodejs和Mongo创建一个restapi。我对Node非常陌生,除了更新所有用户外,我还能够处理所有其他请求,如GET、POST、DELETE、PUT(针对单个用户)

我想更新所有用户的数据。下面是我的代码

import mongoose from 'mongoose';
import { Router } from 'express';
import User from '../model/user';
import bodyParser from 'body-parser';

export default({ config, db }) => {
  let api = Router();

  api.put('/', (req, res) => {
    User.find({}, (err, user) => {
      if (err) {
        res.send(err);
      }

      user.name = req.body.name;
      user.salary = req.body.salary;

      user.save(function(err) {
        if (err) {
          res.send(err);
        }
        res.json({ message: 'All User info updated' });
      });
    });
  });

  return api;
}

我正在获取
用户。当发出put请求时,“保存”
不是一个函数。关于堆栈溢出,我已经讨论了所有的问题,但这让我很困惑。

你可以这样做。在此处查看Mongoose的文档更新功能


你可以这样做。在此处查看Mongoose的文档更新功能


您面临的问题是因为
find
方法的返回类型,或者我可以说是query

mongo中的
find
返回一个
光标(一个迭代器,包含查询结果),它在
mongoose
中的实现将返回一个文档数组

因此,无论您的数据库只有一个用户还是多个用户,
User.find({})
总是会返回一个数组(空数组或包含文档的数组)。由于
.save()
方法仅在有效的mongoose模型上可用,而该模型没有数组(查询结果),因此出现了错误
user.save不是函数。

尝试记录在回调中查找查询后获得的用户,您将获得一个数组

可能的解决方案

1。完全不推荐使用

迭代您在回调中得到的用户(我会说是用户),然后在每个用户上的每个迭代调用
.save()
。跟踪保存文档时可能产生的错误,如果出现任何错误,请中断迭代(您也可以选择继续)

像这样的-

User.find({}, (err, users) => {
  if (err) {
    res.send(err);
  }

  let errorWhileSaving = null;

  for (let user of users) {

    if (errorWhileSaving) {
      res.send(ererrorWhileSaving);
      break;
    }

    user.name = req.body.name;
    user.salary = req.body.salary;

    user.save(function(err) {
      errorWhileSaving = err;
    });
  }

  res.json({ message: 'All User info updated' });
});
User.update(
  {}, 
  {
    $set: {
      name: req.body.name,
      salary: req.body.salary
    }
  },
  {
    multi: true
  },
  function (err, results) {
    if (err) {
      res.send(err);
    }

    res.json({ message: 'All User info updated' });
  }
);
我从不推荐这种方法,因为我们使用这种方法会失去事务的原子性。保存任何用户时的任何故障都会导致数据库的部分更新,这是非常有害的

它还会向数据库服务器发出多个查询,这肯定会影响事务的性能

我所说的事务是指在数据库上运行的任何一组查询(简单或复杂)

2。推荐的

与其使用
.find()
然后对文档进行迭代,然后通过发出多个
.save()
调用来保存文档,不如使用
.update()
方法

有点像这样-

User.find({}, (err, users) => {
  if (err) {
    res.send(err);
  }

  let errorWhileSaving = null;

  for (let user of users) {

    if (errorWhileSaving) {
      res.send(ererrorWhileSaving);
      break;
    }

    user.name = req.body.name;
    user.salary = req.body.salary;

    user.save(function(err) {
      errorWhileSaving = err;
    });
  }

  res.json({ message: 'All User info updated' });
});
User.update(
  {}, 
  {
    $set: {
      name: req.body.name,
      salary: req.body.salary
    }
  },
  {
    multi: true
  },
  function (err, results) {
    if (err) {
      res.send(err);
    }

    res.json({ message: 'All User info updated' });
  }
);
解释

.update
方法-

  • 搜索条件-用于查找要更新的文档的条件。 这里我们提供了
    {}
    ,这意味着我们希望更新
    用户
    集合中的所有文档网
  • 更新选项-这些选项是
    mongodb
    的更新操作符。 这里我们使用
    $set
    在所有文档上设置两个字段
  • 表示查询行为的对象。这里我们使用了
    {muti:true}
    ,它要求mongodb对符合搜索条件的多个文档运行此更新查询
  • Callback(可选)-一个在查询完成执行后调用的函数,可能有错误,也可能有结果
  • 使用这种方法的好处是-

  • 要么所有用户都会得到更新,要么一个都不会。原子性
  • 向数据库发出单个查询,从而提高查询性能
  • 您可以在mongodb文档中找到有关
    .update()
    的更多信息

    改进点

    我注意到,您仍然在使用回调来处理异步任务。如果您还不熟悉承诺,那么就去研究它们,而不是使用回调,优化代码以使用承诺。我曾看到优秀的应用程序开发人员在努力思考回调中包含的代码,所以要明智,开始为更好的未来做出承诺


    是一篇从承诺开始的好文章。

    您面临的问题是因为
    find
    方法的返回类型,或者我可以说是query

    mongo中的
    find
    返回一个
    光标(一个迭代器,包含查询结果),它在
    mongoose
    中的实现将返回一个文档数组

    因此,无论您的数据库只有一个用户还是多个用户,
    User.find({})
    总是会返回一个数组(空数组或包含文档的数组)。由于
    .save()
    方法仅在有效的mongoose模型上可用,而该模型没有数组(查询结果),因此出现了错误
    user.save不是函数。

    尝试记录在回调中查找查询后获得的用户,您将获得一个数组

    可能的解决方案

    1。完全不推荐使用

    迭代您在回调中得到的用户(我会说是用户),然后在每个用户上的每个迭代调用
    .save()
    。跟踪保存文档时可能产生的错误,如果出现任何错误,请中断迭代(您也可以选择继续)

    像这样的-

    User.find({}, (err, users) => {
      if (err) {
        res.send(err);
      }
    
      let errorWhileSaving = null;
    
      for (let user of users) {
    
        if (errorWhileSaving) {
          res.send(ererrorWhileSaving);
          break;
        }
    
        user.name = req.body.name;
        user.salary = req.body.salary;
    
        user.save(function(err) {
          errorWhileSaving = err;
        });
      }
    
      res.json({ message: 'All User info updated' });
    });
    
    User.update(
      {}, 
      {
        $set: {
          name: req.body.name,
          salary: req.body.salary
        }
      },
      {
        multi: true
      },
      function (err, results) {
        if (err) {
          res.send(err);
        }
    
        res.json({ message: 'All User info updated' });
      }
    );
    
    我从不推荐这种方法,因为我们使用这种方法会失去事务的原子性。保存任何用户时的任何故障都会导致数据库的部分更新,这是非常有害的

    它还会向数据库服务器发出多个查询,这肯定会影响事务的性能

    我所说的事务是指在数据库上运行的任何一组查询(简单或复杂)

    2。推荐的

    与其使用
    .find()
    然后迭代文档,然后通过发出多个
    .save()
    调用来保存它们,不如使用
    .update()
    方法