Node.js 更新所有用户数据节点JS Rest PUT
我正在使用Nodejs和Mongo创建一个restapi。我对Node非常陌生,除了更新所有用户外,我还能够处理所有其他请求,如GET、POST、DELETE、PUT(针对单个用户) 我想更新所有用户的数据。下面是我的代码Node.js 更新所有用户数据节点JS Rest PUT,node.js,mongoose,put,Node.js,Mongoose,Put,我正在使用Nodejs和Mongo创建一个restapi。我对Node非常陌生,除了更新所有用户外,我还能够处理所有其他请求,如GET、POST、DELETE、PUT(针对单个用户) 我想更新所有用户的数据。下面是我的代码 import mongoose from 'mongoose'; import { Router } from 'express'; import User from '../model/user'; import bodyParser from 'body-parser';
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;
}
我正在获取
用户。当发出put请求时,“保存”
不是一个函数。关于堆栈溢出,我已经讨论了所有的问题,但这让我很困惑。你可以这样做。在此处查看Mongoose的文档更新功能
你可以这样做。在此处查看Mongoose的文档更新功能
您面临的问题是因为
find
方法的返回类型,或者我可以说是query
mongo中的find
返回一个光标(一个迭代器,包含查询结果),它在mongoose
中的实现将返回一个文档数组
因此,无论您的数据库只有一个用户还是多个用户,User.find({})
总是会返回一个数组(空数组或包含文档的数组)。由于.save()
方法仅在有效的mongoose模型上可用,而该模型没有数组(查询结果),因此出现了错误user.save不是函数。
尝试记录在回调中查找查询后获得的用户,您将获得一个数组
可能的解决方案
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' });
});
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' });
}
);
我从不推荐这种方法,因为我们使用这种方法会失去事务的原子性。保存任何用户时的任何故障都会导致数据库的部分更新,这是非常有害的
它还会向数据库服务器发出多个查询,这肯定会影响事务的性能
我所说的事务是指在数据库上运行的任何一组查询(简单或复杂)
2。推荐的
与其使用.find()
然后对文档进行迭代,然后通过发出多个.save()
调用来保存文档,不如使用.update()
方法
有点像这样-
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' });
});
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
方法-
搜索条件-用于查找要更新的文档的条件。
这里我们提供了{}
,这意味着我们希望更新用户
集合中的所有文档网
更新选项-这些选项是mongodb
的更新操作符。
这里我们使用$set
在所有文档上设置两个字段
表示查询行为的对象。这里我们使用了{muti:true}
,它要求mongodb对符合搜索条件的多个文档运行此更新查询
Callback(可选)-一个在查询完成执行后调用的函数,可能有错误,也可能有结果
使用这种方法的好处是-
要么所有用户都会得到更新,要么一个都不会。原子性
向数据库发出单个查询,从而提高查询性能
您可以在mongodb文档中找到有关.update()
的更多信息
改进点
我注意到,您仍然在使用回调来处理异步任务。如果您还不熟悉承诺,那么就去研究它们,而不是使用回调,优化代码以使用承诺。我曾看到优秀的应用程序开发人员在努力思考回调中包含的代码,所以要明智,开始为更好的未来做出承诺
是一篇从承诺开始的好文章。您面临的问题是因为find
方法的返回类型,或者我可以说是query
mongo中的find
返回一个光标(一个迭代器,包含查询结果),它在mongoose
中的实现将返回一个文档数组
因此,无论您的数据库只有一个用户还是多个用户,User.find({})
总是会返回一个数组(空数组或包含文档的数组)。由于.save()
方法仅在有效的mongoose模型上可用,而该模型没有数组(查询结果),因此出现了错误user.save不是函数。
尝试记录在回调中查找查询后获得的用户,您将获得一个数组
可能的解决方案
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' });
});
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' });
}
);
我从不推荐这种方法,因为我们使用这种方法会失去事务的原子性。保存任何用户时的任何故障都会导致数据库的部分更新,这是非常有害的
它还会向数据库服务器发出多个查询,这肯定会影响事务的性能
我所说的事务是指在数据库上运行的任何一组查询(简单或复杂)
2。推荐的
与其使用.find()
然后迭代文档,然后通过发出多个.save()
调用来保存它们,不如使用.update()
方法