更新所有用户数据 Nodejs Rest PUT

Updating all Users Data Nodejs Rest PUT

我正在使用 Nodejs 和 Mongo 创建 REST Api。我是 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;
}

我收到 user.save is not a function when put request is made。我在 Stack Overflow 上查看了所有关于此的问题,但它让我很困惑。

你可以做到。在此处检查 Mongoose 的文档更新功能 http://mongoosejs.com/docs/documents.html

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.update({}, {
            name: req.body.name,
            salary: req.body.salary
        }, {
            multi: true
        }, (err, data) => {
            if (err) {
                res.send(err);
            }
            res.json({
                message: 'All User info updated'
            });
        });
    });

    return api;
}

您遇到的问题是因为 find 方法的 return 类型,或者我会说查询。

find in mongo returns a cursor(迭代器,包含查询结果)及其在 mongoose 中的实现还给你一组文件

因此,无论您的数据库只有一个用户还是多个用户,User.find({}) 总是会 return 您一个数组(一个空数组或包含您的文档的数组)。并且由于 .save() 方法仅适用于有效的 mongoose 模型,数组(查询结果)不是因此你得到了那个错误 user.save is not a function.

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

可能的解决方案

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' });
});

我从不推荐这种方法,因为使用这种方法我们失去了事务的原子性。保存任何用户时的任何失败都会导致数据库的部分更新,这非常有害。

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

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

2。推荐

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

有点像这样 -

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 方法需要 -

  1. 搜索条件 - 将用于查找要更新的文档的条件。 这里我们提供了 {} 这意味着我们要更新 users 集合中的所有文档网络。
  2. 更新选项 - 这些选项是 mongodb 的更新操作符。 在这里,我们使用 $set 在所有文档上设置两个字段。
  3. 表示查询行为的对象。这里我们使用了 {muti: true},它要求 mongodb 对符合搜索条件的多个文档进行 运行 此更新查询。
  4. 回调(可选)- 查询完成执行后将调用的函数,无论是错误还是结果。

使用这种方法的好处是 -

  1. 所有用户都将获得更新,或者 none 将获得更新。原子性
  2. 向数据库发出单个查询,从而提高查询性能。

您可以在 mongodb 文档中找到有关 .update() 的更多信息。

改进点

我注意到,您仍在使用回调来处理异步任务。如果您还不熟悉 promises,那就去研究它们,而不是使用回调,优化您的代码以使用 Promises。我见过优秀的应用程序开发人员努力推理包装在回调中的代码,所以明智地开始使用 Promises 以获得更美好的未来。

Here 是一篇从 Promises 开始的好文章。