gpt4 book ai didi

javascript - 如何使用 AngularJS 推送到 MongoDB 数组?

转载 作者:可可西里 更新时间:2023-11-01 10:00:38 26 4
gpt4 key购买 nike

我正在尝试使用 AngularJS 的 $http 服务将一堆注释附加到 MongoDB 数组,但我似乎陷入了死胡同。这是我试过的代码(它使我的 DOM 崩溃):

$scope.saveComment = function(i){
console.log("id is " + i);
$http.put('/api/its/' + i, { comments: {$push: { words: $scope.comment, userId: $scope.getCurrentUser().name } } } ).success(function(stuff){
document.location.reload(true);
})
}

我试图使用 MongoDB 的 $push 方法来执行此操作,但 Angular 没有。关于我如何做到这一点的任何线索?

此致

彼得

附言

这是该特定模型的更新功能的服务器端代码:

// Updates an existing it in the DB.
exports.update = function(req, res) {
if(req.body._id) { delete req.body._id; }
It.findById(req.params.id, function (err, it) {
if (err) { return handleError(res, err); }
if(!it) { return res.send(404); }
var updated = _.merge(it, req.body);
updated.save(function (err) {
if (err) { return handleError(res, err); }
return res.json(200, it);
});
});
};`

最佳答案

这里有一些东西不是很好,但首先要涵盖基础知识并让你继续。

第一件事是修复调用服务 Angular 端的方法。 API 端点当然不期望您正在使用的 MongoDB 更新语法,而只是一个对象。所以首先解决这个问题:

$scope.saveComment = function(i){
console.log("id is " + i);

// Split these out so they are easy to log and debug
var path = '/api/its' + i;

// This must mirror the structure expected in your document for the element
// Therefore "comments" is represented as an array of objects, even
// where this is only one.
var data = {
comments: [{
words: $scope.comment,
userId: $scope.getCurrentUser().name
}]
};

// Call service with response
$http.put(path,data).success(function(stuff){
document.location.reload(true);
});
}

现在您的服务器 API 端出现了一些故障,我希望进行全面的重新设计,但由于缺乏信息,只能专注于解决主要问题而无需做太多更改。

假设这是 lodash图书馆,.merge()这里的功能实现不正确。需要告诉它如何正确地“处理”“合并”中的数组内容,目前最好的情况是“覆盖”。所以我们给它一些智慧:

// Updates an existing it in the DB.
exports.update = function(req, res) {
if(req.body._id) { delete req.body._id; }
It.findById(req.params.id, function (err, it) {
if (err) { return handleError(res, err); }
if(!it) { return res.send(404); }
var updated = _.merge(it, req.body,function(a,b) {
if (_.isArray(a)) {
return a.concat(b); // join source and input
}
});
updated.save(function (err) {
if (err) { return handleError(res, err); }
return res.json(200, updated);
});
});
};`

但这有一个问题,因为它只会“追加”到数组。因此,如果您在输入中放入已经存在的内容,那么原始项目和数组输入中的任何内容都会被添加。

根据您的需要,处理这个问题是另一个需要解决的问题。

从我自己的 Angular 来看,我会尽可能发送数组,并有一个“仅”用于附加到文档数组的端点,而不是像您在此处那样进行“通用”文档更新。

这使您可以根据预期操作更好地利用 MongoDB 更新功能。所以在服务调用中是这样的:

// comment can just be a singular object now
$http.put(path,{
"words": "this that",
"userId": 123
}).success(function(stuff){

在服务端API端:

exports.addComment = function(req, res) {
if(req.body._id) { delete req.body._id; }
It.findByIdAndUpdate(req.params.id,
{ "$push": { "comments": req.body } },
{ "new": true },
function(err,it) {
if (err) { return handleError(res, err); }
if(!it) { return res.send(404); }
return res.json(200, it);
}
);
};

所以这将简单地获取“评论”的主体并将其附加到数组中。最重要的是,它是“原子地”执行此操作的,因此在执行当前“合并”正在执行的操作时,其他可能的请求不会发生冲突。对同一端点的其他请求将仅“追加”到当前状态的数组,就像发出请求时一样,这也是如此。

这就是$push运算符是为了,所以使用它是明智的。

一些深思。

关于javascript - 如何使用 AngularJS 推送到 MongoDB 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31667759/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com