2017-06-14 2 views
0

Je suis développeur nodejs. J'utilise Mongodb avec ORM waterline et async lib pour effectuer une mise à jour des tâches. ci-dessous sont les étapes que je suis suivantesmise à jour des enregistrements de base de données en utilisant waterline orm, mongodb et async.parallel

function update(task, payload, next) { 
    const self = this; 

    async.auto({ 
     createUpdateObj : (callback) => { 
      let update = { status : payload.status }; 

      return callback(null, update); 
     }, 
     updateTask : ['createUpdate', (result, callback) => { 
      self.waterline.collections.task.update(task.id, result.creatUpdateObj, callback); 
     }] 
    }, (err, results) => { 
     if(err) return next(err); 

     return next(null, { message : "Task updated successfully." }); 
    }); 
} 

let dbTasks = [ { id : 1, name : 'Testing', status : 'To Do' }, { id : 2, name : 'Development', status : 'In Progress' } ] 

let asyncTasks = []; 

let payload = { 
    tasks = [{ id : 1, status : 'Done'}, {id : 2, status : 'Testing'}] 
}; 

dbTasks.forEach((task, index) => { 
    asyncTasks.push(function(cb) { 

     update.bind(hapiServerObject)(task, payload.tasks[index], cb) 
    }); 
}); 

async.parallel(asyncTasks, console.log); // It prints the response message 2 times. 

Ci-dessus est le code. Le code fonctionne comme prévu mais seul le problème auquel je suis confronté est, Chaque statut de la tâche dans la base de données est mis à jour à 'Testing'. Cela signifie que la dernière requête de mise à jour de base de données met à jour tous les autres statuts.

Une fois la requête de mise à jour, le résultat attendu devrait être

[ { id : 1, name : 'Testing', status : 'Done' }, { id : 2, name : 'Development', status : 'Testing' } ] 

Résultat réel est

[ { id : 1, name : 'Testing', status : 'Testing' }, { id : 2, name : 'Development', status : 'Testing' } ] 

Je ne reçois pas où je me trompe. Je sais que c'est lié au référencement de l'objet mais je ne peux pas trouver où la réfrence est changée. Avant que la requête ne soit exécutée, la formation de l'objet est ok.

Outils utilisés: - hapijs, waterline -> 0.11, module asynchrone et mongodb.

Répondre

0

Ok, j'ai trouvé la réponse. Le code fonctionne correctement. Le problème est, avant la mise à jour de la tâche, j'utilise une requête de ligne d'eau native à travers laquelle j'obtiens "_id" de l'enregistrement de mongodb. Waterline ne comprend pas la valeur de "_id" reçue du résultat de la requête native. Ainsi, la requête de mise à jour devient la ligne de flottaison De

waterline.collections.collection.update({ id : _id }, { status : "Testing" }).exec() 

Pour

waterline.collections.collection.update({}, { status : "Testing" }).exec() 

Et ainsi, tous les enregistrements sont mis à jour avec l'état de la dernière requête db.