【问题标题】:What is the best way to make new mongoDB documents off of an array using node and mongoose?使用节点和猫鼬从数组中制作新的 mongoDB 文档的最佳方法是什么?
【发布时间】:2015-09-21 16:54:16
【问题描述】:

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

我尝试这样做的原因是允许用户创建问题调查。每个问题都是填写调查问卷的自己的对象(作为一个属性,将包含这些问题 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);

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

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

【问题讨论】:

    标签: node.js loops post mongoose mean-stack


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 2016-05-05
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      相关资源
      最近更新 更多