2016-03-26 3 views
0

Я внедряю систему утверждения с использованием Mongoose, Express и NodeJS.Mongoose save() возвращает до findOne()

Каждое сообщение имеет 2 набора утверждений.

Я реализовал модель, как показано ниже:

Post Schema: 
var PostSchema = new Schema({ 
UserId: { type: ObjectId, unique: true, default: null }, 
/.. 
.. Object related fields 
../ 
    Approval1: Object, //chidschema objects of approver 
    Approval2: Object 
}); 

Approval Mapping Schema: 
var ApprovalMapSchema = new Schema({ 
    UserId: { type: ObjectId, unique: true, default: null }, 
    Approver1Id: { type: ObjectId, default: null }, 
    Approver2Id: { type: ObjectId, default: null } 
}); 

Я пытаюсь найти отображение первого в моей функции, а затем обновить основной пост объект на сохранения.

Мне нужно получить оба идентификатора подтверждения, прежде чем сохранять новое сообщение.

Пожалуйста, предложите хороший способ для этого. Сейчас я делаю:

  1. Сохранить новый Post объект Сохранить // возвращает после 2-го шага, я KNW сохранить в Мангуста в асинхронном, но я не хочу, шаг 2 можно назвать, прежде это
  2. Get Идентификаторы утвердителя с findOne on ApprovalMapSchema
  3. Обновить объект публикации с утверждениями.

    post.save (функции (эээ, док) { если (ERR) {} еще { console.log ({успех: правда, тзд: 'Успешный создан новый пост', содержание: док}) ; } });

    /*var actId = activation._id, distributorId, ttlId; 
    
    var approvalMap = ApprovalMap.findOne({ userId: myUserId }, function(err, appMap) { 
        if (err) throw err; 
        else{   
         Approver1Id = appMap.Approver1Id; 
         Approver2Id = appMap.Approver2Id; 
        } 
    }); 
    
    // Create child objects after this and update as subdocument 
    

Это не работает для меня. Пожалуйста помоги!

ответ

1

У меня возникли трудности с пониманием вашего вопроса. Но это звучит, как вы хотите сделать что-то вроде этого (вам нужно будет изменить это на основе того, что вы хотите сделать, но, надеюсь, это показывает один из способов обработки поведения асинхронного):

//This will run a query that returns a document where userId == myUserId 

    ApprovalMap.findOne({ userId: myUserId }, function(err, appMap) { 

     if (err) throw err; 

     //Once the query is complete function(err, appMap) will be called 
     //err will contain an error object if there was an error 
     //appMap will be the data returned by the query. 
     //within this block you can run another query 
     //for example 

     ApprovalMap.findOne({approved:'some variable'},function(err, secondQueryData){ 

      if (err) throw err; 

      //after this query is complete function(err, secondQueryData) will be called 
      //once again the err argument will be an error, and the 

      //secondQueyrData argument will contain your return data 

      //here you can do something with the data 
      //for example, log the results 

      console.log(secondQueryData) 
     }) 
    }); 

Как вы можете см., вы можете вложить дополнительные запросы или шаги в обратные вызовы других запросов. Это гарантирует, что все будет работать в правильном порядке. вы также можете проверить асинхронную библиотеку npm или библиотеку обещаний типа q или bluebird. У них также есть отличные решения для обработки асинхронного поведения в узле.

+0

спасибо @ пользователь2263572 .. ** asyc ** сделал трюк ... это был спаситель, он много боролся за это! – andoidbaby

0

по запросу @ user2263572, отправился на асинхронную библиотеку.

это, как я реализовал это сейчас:

async.waterfall(
    [ 
     function(callback){ 
      ApprovalMap.findOne({ userId: myUserId }, function(err, appMap) { 
       if (err) throw err; 
       else{   
        //..Create child approval elements and assign Ids from map 
        callback(err, Approver1Child, Approver2Child); 
       } 
      }); 
     }, 
     function(Approver1Child, Approver2Child, callback){ 
      var post = new Post(req.body); 
      post.distApproval = Approver1Child; 
      post.ttlApproval = Approver2Child; 
      post.userId = myUserId; 
      callback(null, post); 
     } 
    ], 
    function(err, post){ 
     //creating new order 
     post.save(function(err, doc) { 
      if (err) { 
      } 
      else 
      { 
       console.log({success: true, msg: 'Successful created new post', content: doc}); 
      } 
     }); 
    } 
); 

спасибо @ user2263572 !! Ура!

Смежные вопросы