node.js - 使用 Node 和 Mongoose 从数组中生成新的 mongoDB 文档的最佳方法是什么?

标签 node.js loops post mongoose mean-stack

我正在使用 MeanJS,用户输入一个对象列表,每个对象都需要创建一个新文档。同时,我需要创建另一个单独的文档,其中包含指向数组中每个对象的指针,并将每个对象链接回这个新文档。因此,最终结果需要是链接到模型“S”的另一个文档的任意数量的模型“Q”文档。

我尝试这样做的原因是允许用户创建问题调查。每个问题都是其自己的对象,用于填充调查(调查作为一个属性,将包含这些问题 ID 的列表)。

S = {"_id": 0, "Qids": [ObjectId("1"), ObjectId("2"), ObjectId("3"), ObjectId("4")]}
Q1 = {"_id": ObjectId("1"), "Sid": ObjectId("0")}
Q2 = {"_id": ObjectId("2"), "Sid": ObjectId("0")}
Q3 = {"_id": ObjectId("3"), "Sid": ObjectId("0")}
Q4 = {"_id": ObjectId("4"), "Sid": ObjectId("0")}

我的问题:我似乎无法在不遇到某种回调问题的情况下执行此操作。有人能给我一些建议吗?这就是现在的样子:

客户端:

$scope.Qlist = [Q1, Q2, Q3, Q4];
$scope.S = {};
$http.post('/S', $scope.S).success(function(data){
    var req_obj = {
        Sid: data._id,
        Q: {}
    };
    for (var i = 0; i<$scope.Qlist.length; i++) {
        req_obj.Q = $scope.Qlist[i];
        $http.post('/Q', req_obj);
    };
});

服务器端:

app.route('/Q')
    .post(users.requiresLogin, questions.hasAuthorization, questions.fillSurvey);

然后我有服务器端 Controller 来处理这些功能。 questions.fillsurvey 函数将问题添加到 MongoDB,然后获取每个问题的 id,并将它们推送到 Qids 下的 S 文档中。大部分工作正常,但是当客户端发送 Q1、Q2、Q3 和 Q4 时,服务器只接收 Q4,四次。

理想情况下,我希望在一次发布请求中一起发送 $scope.Qlist$scope.S 并让服务器端解决所有问题,但我总是被回调函数所困扰,这就是为什么我选择在客户端通过 $scope.Qlist 循环发布帖子。如果有人对此有“最佳实践”解决方案,我将非常感谢您的帮助!

最佳答案

简短回答:您需要在 for 循环内定义 req_obj

长答案:JavaScript 依赖于闭包来处理变量作用域。 JavaScript 也是一种异步语言。这意味着在 JS 中,您的 for 循环不会等待 $http.post 完成才继续。

通过将 req_obj 放在 for 循环之外,JS 的异步部分会在第一个 $http 完成准备和触发之前修改 req_obj.Q 4 次。将req_obj移入for循环中,将其从上面的闭包中移出,并将其放入for循环的闭包中,这类似于匿名函数。

关于node.js - 使用 Node 和 Mongoose 从数组中生成新的 mongoDB 文档的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31213735/

相关文章:

node.js - 使用 Node HTTP 请求从 GitHub API 发生套接字挂起错误

iphone - Objective-C 中的快速枚举(循环)如何工作? (即: for (NSString *aString in aDictionary). ..)

Git fetch 卡在 git-upload-pack 上

java - 使用 Jersey 进行 POST 时出现错误 415

javascript - 在 Passport.authenticate() 内部重定向时出现问题

javascript - 在 Rails 服务器端运行 javascript

node.js - ElasticSearch:如何使用 ElasticSearch API 仅返回特定字段?

c - 条件操作是什么意思?

python - 将 Perl For 循环转换为 Python

javascript - PHP 中如何定义索引?