2015-09-04 2 views
0

Я пытаюсь обновить свой документ mongodb с помощью функции update(), но считаю, что он абсолютно ничего не делает.не удалось изменить документ с помощью функции mongodb update()

// Require mongo db user model 
var User = require("./models/user.js"); 

app.post("/addfriend", function(req, res) { 
    // get document by email  
    User.findOne({ email: req.body.email }, function (err, doc){ 

     var requester = req.user; 
     var requested = doc; 

     User.update(
      { _id: requested._id }, 
      { $push: { requests: requester._id } } 
     ) 

     return res.redirect("/success"); 
    }); 
}); 

Это схема пользователя:

var userSchema = mongoose.Schema({ 
    firstname: String, 
    lastname: String, 
    email: String, 
    password: String, 

    friends: [mongoose.Schema.Types.ObjectId], 

    requests: [mongoose.Schema.Types.ObjectId], 

    activityLog: [mongoose.Schema.Types.Mixed], 

    events: [mongoose.Schema.Types.Mixed] 
}); 

, если я вхожу значение requester._id в консоли она производит желаемый результат. Если кто-то может помочь отладить этот код, это будет очень полезно! Дайте мне знать, нужен ли какой-либо другой код. Благодаря!

ответ

1

Вам необходимо действовать в обратном вызове. Это должно быть, если курс действительно обновляет данные, но вы попадаете на перенаправленную страницу до того, как действие действительно завершится. Также вы обнаруживаете несоответствие в том, откуда поступает вход.

Существует также нет смысла, и здесь также не следует практиковать «извлечение» данных перед выполнением обновления. У вас уже есть поле «электронной почты», чтобы соответствовать, так что просто сделать это прямо:

app.post("/addfriend/:user", function(req, res) { 

     console.log("addfriend: %s", req.params.user); 

     User.update(
      { email: req.body.email }, 
      { $push: { requests: req.params.user } }, 
      function(err,numAffected) { 
       if (numAffected) { // 1 where matched or 0 if not 
        res.redirect("/success"); 
       } else { 
        // handle not found or possibly error as well 
       } 
      }     
     ); 

}); 

отметить также, что ваш «пользователь» вы хотите добавить считывается из параметров в URL здесь, и, возможно, должны быть настроенный на тело POST, если вы туда отправляете его в реальности. Но это будет общий формат запроса типа REST.

Это «зарегистрировано» здесь, что является хорошей практикой, поэтому вы можете видеть, что вы получаете, и действия работают по назначению.

Также рассмотрите возможность изменения этого параметра на REST API. Перенаправление на страницу должно быть другой логикой, связанной с общим действием API, которое должно просто вернуть статус 200 Ok 404 Не найдено или 500 Ошибка, если это необходимо.

Чтобы немного улучшить это, попробуйте также проверить, что «друг» не является частью массива контактов, прежде чем добавлять его. Как правило, это хорошая идея:

 User.update(
      { email: req.body.email, requests: { $ne: req.params.user } }, 
      { $push: { requests: req.params.user } }, 
      function(err,numAffected) { 
       // handling here 
      } 
     )