node.js и mongoose: как вызвать 2 метода вложенных обратных вызовов для сохранения в коллекцию и вложенный список? - PullRequest
0 голосов
/ 15 апреля 2011

Я создаю приложение node.js, используя mongoDB. Мне нужно создать объект книги, сохранить его, а также добавить его в список книг пользователя. Затем мне нужно иметь одно «сохранение» для книги, а затем второе для пользователя (для которого был обновлен список книг).

Я делаю что-то вроде:

book = new Book();   // I'm using moogoose 
book.title = req.params.title
book.save(function(err){
  if(!err){
    jsonObj = {"title":book.title};
    res.writeHead(200, {'content-type': 'application/json'});
    res.write(JSON.stringify(jsonObj));
    res.end();

    // Add book in user things list
    user.books.push(book);
    user.save(function(error){
      if(error) {
        console.log(JSON.stringify({ "error" : "internal error" }));
      }
    });
  } else {
    jsonObj = { "error" : "internal error while saving book" };
    res.writeHead(200, {'content-type': 'application/json'});
    res.write(JSON.stringify(jsonObj));
    res.end();
  }
  console.log(JSON.stringify(jsonObj));
});

Кажется, что иногда книга сохраняется в БД, а не сохраняется в списке книг пользователя, а иногда наоборот. Я не очень хорошо знаком с методом асинхронного обратного вызова (вложенный поверх этого ...).

Я, конечно, что-то не так делаю ... Какой лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 16 апреля 2011

Я сам не слишком уверен, но думаю, что Mongo сохраняет два разных объекта книги, потому что считает их двумя разными объектами (даже для Javascript книга в массиве пользователя и объект оба указывают на одно и то же) ..

Вам будет лучше сохранить объект Book в Mongo.Получите _ObjectID (сгенерированный MongoDB) и сохраните его в массиве книг пользователя.

0 голосов
/ 15 апреля 2011

В целях отладки измените код на:

} else {
  console.log("error saving book : ", err);
  jsonObj = { "error" : "internal error while saving book" };
  res.writeHead(200, {'content-type': 'application/json'});
  res.write(JSON.stringify(jsonObj));
  res.end();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...