簡體   English   中英

數據庫中的多層數組,無法將數組推入第二層

[英]Multilayered array in database, can't push array into second layer

在我的數據庫中,我對testdata進行了以下設置:

test1  [

   [0] { test: Array, comments: Array },
   [1] { test: Array, comments: Array }

]

以下是我定義userSchema的方式,它包含更多內容,但我認為在這種情況下它們是不相關的。

var UserSchema = new Schema({

    test1: { type: Array, required: false },
    test2: { type: Array, required: false },
    test3: { type: Array, required: false }

});

以下是將數據保存到數據庫的代碼的一部分。 “ newTest1”是一個注釋數組。 我一直在嘗試向對象添加評論,但一直無法這樣做。 我的想法是,我首先添加創建對象的數據(請參見下面的api.js),然后添加注釋。

沒有錯誤顯示,我沒有嘗試添加到對象中的數組。 在api.js中(向下的代碼段),我可以推入數組的第一層,但不能推入其中的對象。 這必須意味着我無法從數據庫中查看數組,但是我不知道為什么會這樣。 我想如果我能以某種方式從數據庫中獲取數組,則添加注釋,然后user.save可以正常工作,但我不知道該怎么辦,或者這是否是最佳解決方案。 有人可以幫我嗎?

HTML:

  <form name="edit.test1" ng-submit="ctrl.updateTest1(newComment1, newComment2, ctrl.artikel)">

    <div class="form-group">
        <label>Kommentarer:</label>
        <input class="form-control" type="text" name="test1" placeholder="Comment on first value" ng-model="newComment1" autocomplete="off">
        <br>
        <input class="form-control" type="text" name="test1" placeholder="Comment on second value" ng-model="newComment2" autocomplete="off">
    </div>

        <button type="submit" class="btn btn-primary">Submit</button>

  </form>

控制器:

app.updateTest1 = function(newComment1, newComment2, index) {
          app.errorMsg = false; // Clear any error message
          app.disabled = true; // Lock form while processing
          // Check if username submitted is valid

              var userObject = {}; // Create the user object to pass to function
              userObject._id = app.currentUser; // Pass current user _id in order to edit

              userObject.test1 = [$scope.newComment1, $scope.newComment2, index]; // Set the new username provided

              // Runs function to update the user's username
              User.editUser(userObject).then(function(data) {

                // Behöver jag lägga till något här??

              });
            };

Userfactory:

  userFactory.editUser = function(id) {
        return $http.put('/api/edit', id);
    };

用戶注冊時創建新用戶:

router.post('/users', function(req, res) {
        var user = new User(); // Create new User object
        user.username = req.body.username; // Save username from request to User object
        user.password = req.body.password; // Save password from request to User object
        user.email = req.body.email; // Save email from request to User object
        user.name = req.body.name; // Save name from request to User object
        user.temporarytoken = jwt.sign({ username: user.username, email: user.email }, secret, { expiresIn: '24h' }); // Create a token for activating account through e-mail

        // Check if request is valid and not empty or null
        if (req.body.username === null || req.body.username === '' || req.body.password === null || req.body.password === '' || req.body.email === null || req.body.email === '' || req.body.name === null || req.body.name === '') {
            res.json({ success: false, message: 'Ensure username, email, and password were provided' });
        } else {
            // Save new user to database
            user.save(function(err) {
                if (err) {
                    // Check if any validation errors exists (from user model)
                    if (err.errors !== null) {
                        if (err.errors.name) {
                            res.json({ success: false, message: err.errors.name.message }); // Display error in validation (name)
                        } else if (err.errors.email) {
                            res.json({ success: false, message: err.errors.email.message }); // Display error in validation (email)
                        } else if (err.errors.username) {
                            res.json({ success: false, message: err.errors.username.message }); // Display error in validation (username)
                        } else if (err.errors.password) {
                            res.json({ success: false, message: err.errors.password.message }); // Display error in validation (password)
                        } else {
                            res.json({ success: false, message: err }); // Display any other errors with validation
                        }
                    } else if (err) {
                        // Check if duplication error exists
                        if (err.code == 11000) {
                            if (err.errmsg[61] == "u") {
                                res.json({ success: false, message: 'That username is already taken' }); // Display error if username already taken
                            } else if (err.errmsg[61] == "e") {
                                res.json({ success: false, message: 'That e-mail is already taken' }); // Display error if e-mail already taken
                            }
                        } else {
                            res.json({ success: false, message: err }); // Display any other error
                        }
                    }
                } else {
                    // Create e-mail object to send to user
                    var email = {
                        from: 'MEAN Stack Staff, cruiserweights@zoho.com',
                        to: [user.email, 'gugui3z24@gmail.com'],
                        subject: 'Your Activation Link',
                        text: 'Hello ' + user.name + ', thank you for registering at localhost.com. Please click on the following link to complete your activation: http://www.herokutestapp3z24.com/activate/' + user.temporarytoken,
                        html: 'Hello<strong> ' + user.name + '</strong>,<br><br>Thank you for registering at localhost.com. Please click on the link below to complete your activation:<br><br><a href="http://www.herokutestapp3z24.com/activate/' + user.temporarytoken + '">http://www.herokutestapp3z24.com/activate/</a>'
                    };
                    // Function to send e-mail to the user
                    client.sendMail(email, function(err, info) {
                        if (err) {
                            console.log(err); // If error with sending e-mail, log to console/terminal
                        } else {
                            console.log(info); // Log success message to console if sent
                            console.log(user.email); // Display e-mail that it was sent to
                        }
                    });
                    res.json({ success: true, message: 'Account registered! Please check your e-mail for activation link.' }); // Send success message back to controller/request
                }
            });
        }
    });

api.js:

    router.put('/edit', function(req, res) {
            var editUser = req.body._id; // Assign _id from user to be editted to a variable
            if (req.body.name) var newName = req.body.name; // Check if a change to name was requested
            if (req.body.username) var newUsername = req.body.username; // Check if a change to username was requested
            if (req.body.email) var newEmail = req.body.email; // Check if a change to e-mail was requested
            if (req.body.permission) var newPermission = req.body.permission; // Check if a change to permission was requested

            if (req.body.test1) {
              var newTest1 = req.body.test1;
            }
            if (req.body.test2) {
              var newTest2 = req.body.test2;
            }
            if (req.body.test3) {
              var newTest3 = req.body.test3;
            }
            if (req.body.test4) {
              var newTest4 = req.body.test4;
            }
            if (req.body.test5) {
              var newTest5 = req.body.test5;
            }


            // Look for logged in user in database to check if have appropriate access
            User.findOne({ username: req.decoded.username }, function(err, mainUser) {
                if (err) {
                    // Create an e-mail object that contains the error. Set to automatically send it to myself for troubleshooting.
                    var email = {
                        from: 'MEAN Stack Staff, cruiserweights@zoho.com',
                        to: 'gugui3z24@gmail.com',
                        subject: 'Error Logged',
                        text: 'The following error has been reported in the MEAN Stack Application: ' + err,
                        html: 'The following error has been reported in the MEAN Stack Application:<br><br>' + err
                    };
                    // Function to send e-mail to myself
                    client.sendMail(email, function(err, info) {
                        if (err) {
                            console.log(err); // If error with sending e-mail, log to console/terminal
                        } else {
                            console.log(info); // Log success message to console if sent
                            console.log(user.email); // Display e-mail that it was sent to
                        }
                    });
                    res.json({ success: false, message: 'Something went wrong. This error has been logged and will be addressed by our staff. We apologize for this inconvenience!' });
                } else {
                    // Check if logged in user is found in database
                    if (!mainUser) {
                        res.json({ success: false, message: "no user found" }); // Return error
                    } else {
                        // Check if a change to name was requested

-----> HERE               if (newTest1) {
                          // Check if person making changes has appropriate access
                          if (mainUser.permission === 'admin') {
                              // Look for user in database
                              User.findOne({ _id: editUser }, function(err, user) {
                                  if (err) {
                                      res.json({ success: false, message: 'Something went wrong. This error has been logged and will be addressed by our staff. We apologize for this inconvenience!' });
                                  } else {
                                      // Check if user is in database
                                      if (!user) {
                                          res.json({ success: false, message: 'No user found' }); // Return error
                                      } else {

                                            if (Array.isArray(newTest1)) {
                ------> this does not work   user.test1[0].comments.push(newTest1);
                                            //user.test1.splice(index, 0, newTest1)
                                          } else {
               ---> this works              var testet1 = { test: newTest1.split(" "), comments: Array };
                                            user.test1.push(testet1); // Assign new name to user in database
                                          }
                                          // Save changes
                                              user.save(function(err) {
                                                  if (err) {
                                                      console.log(err); // Log any errors to the console
                                                  } else {
                                                      res.json({ success: true, message: 'Name has been updated!' }); // Return success message
                                                  }
                                              });
                                      }
                                  }
                              });

Javascript數組始終是帶編號的索引,並且不支持命名索引。 除非我錯過了一些事情,否則看起來您正在嘗試通過給它命名的索引創建一個不起作用的關聯數組。

首先,您需要對Schema進行一些調整,以使test1數組包含具有屬性answerscomments對象,並使它們也成為數組。 然后將其插入到您的主模式中,如下所示:

var nestedSchema = new Schema ({
  answers: {type: Array, required: false},
  comments: {type: Array, required: false}
})

var UserSchema = new Schema({
    test1: { type: [nestedSchema], required: false },
    test2: { type: Array, required: false },
    test3: { type: Array, required: false }
});

然后, user.test1[0].comments.push(newTest1)應該可以正常工作。 推送新評論時,請不要忘記傳遞所需答案的索引。 像這樣的user.test1[index].comments.push(newTest1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM