繁体   English   中英

更新所有用户数据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时发出了放置请求, user.save它不是一个函数。 我在Stack Overflow上经历了所有与此有关的问题,但是这对我来说却很令人困惑。

你可以这样做。 http://mongoosejs.com/docs/documents.html上检查Mongoose的文档更新功能

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方法的返回类型,或者我会说查询。

在mongo中的find返回一个cursor (是一个迭代器,包含查询的结果),其在mongoose实现将为您提供一系列文档

因此,无论您的数据库只有一个用户还是多个用户都没有关系, User.find({})总是会返回一个数组(一个空数组或包含您的文档的数组)。 而且由于.save()方法仅在有效的猫鼬模型上可用,因此数组(您的查询结果)不是有效的,因此您会遇到错误user.save is not a function.

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

可能的解决方案

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

使用这种方法的好处是-

  1. 所有用户都将得到更新,否则将不会。 原子性
  2. 向数据库发出单个查询,从而提高查询性能。

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

改进点

我注意到,您仍在使用回调来处理异步任务。 如果您还不熟悉Promise,则请研究它们,而不是使用回调,而是优化代码以使用Promises。 我见过优秀的应用程序开发人员在为包装在回调中的代码而苦苦思索,所以要明智并开始使用Promises来创造更好的未来。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM