[英]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
方法期望-
{}
,這意味着我們想更新users
集合中的所有documnet。 mongodb
的更新操作符。 在這里,我們使用$set
在所有文檔上設置兩個字段。 {muti: true}
,它要求mongodb在符合搜索條件的多個文檔上運行此更新查詢。 使用這種方法的好處是-
您可以在mongodb文檔中找到有關.update()
更多信息。
改進點
我注意到,您仍在使用回調來處理異步任務。 如果您還不熟悉Promise,則請研究它們,而不是使用回調,而是優化代碼以使用Promises。 我見過優秀的應用程序開發人員在為包裝在回調中的代碼而苦苦思索,所以要明智並開始使用Promises來創造更好的未來。
這是一篇很好的文章,從Promises開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.