簡體   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