更新所有用户数据 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
方法需要 -
- 搜索条件 - 将用于查找要更新的文档的条件。
这里我们提供了
{}
这意味着我们要更新 users
集合中的所有文档网络。
- 更新选项 - 这些选项是
mongodb
的更新操作符。
在这里,我们使用 $set
在所有文档上设置两个字段。
- 表示查询行为的对象。这里我们使用了
{muti: true}
,它要求 mongodb 对符合搜索条件的多个文档进行 运行 此更新查询。
- 回调(可选)- 查询完成执行后将调用的函数,无论是错误还是结果。
使用这种方法的好处是 -
- 所有用户都将获得更新,或者 none 将获得更新。原子性
- 向数据库发出单个查询,从而提高查询性能。
您可以在 mongodb 文档中找到有关 .update()
的更多信息。
改进点
我注意到,您仍在使用回调来处理异步任务。如果您还不熟悉 promises,那就去研究它们,而不是使用回调,优化您的代码以使用 Promises。我见过优秀的应用程序开发人员努力推理包装在回调中的代码,所以明智地开始使用 Promises 以获得更美好的未来。
Here 是一篇从 Promises 开始的好文章。
我正在使用 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
方法需要 -
- 搜索条件 - 将用于查找要更新的文档的条件。
这里我们提供了
{}
这意味着我们要更新users
集合中的所有文档网络。 - 更新选项 - 这些选项是
mongodb
的更新操作符。 在这里,我们使用$set
在所有文档上设置两个字段。 - 表示查询行为的对象。这里我们使用了
{muti: true}
,它要求 mongodb 对符合搜索条件的多个文档进行 运行 此更新查询。 - 回调(可选)- 查询完成执行后将调用的函数,无论是错误还是结果。
使用这种方法的好处是 -
- 所有用户都将获得更新,或者 none 将获得更新。原子性
- 向数据库发出单个查询,从而提高查询性能。
您可以在 mongodb 文档中找到有关 .update()
的更多信息。
改进点
我注意到,您仍在使用回调来处理异步任务。如果您还不熟悉 promises,那就去研究它们,而不是使用回调,优化您的代码以使用 Promises。我见过优秀的应用程序开发人员努力推理包装在回调中的代码,所以明智地开始使用 Promises 以获得更美好的未来。
Here 是一篇从 Promises 开始的好文章。