Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

193
Vistas
Nodejs asíncrono sobrescribiendo valores con knex

Estoy tratando de guardar varios registros en la base de datos usando asíncrono, pero siempre termino en un registro sobrescribiendo a otros.

Aquí está mi lógica:

 var deferred = q.defer(); var records = [{emp_id:1, got_bonus: true},{emp_id:2, got_bonus: false},{emp_id:3, got_bonus: true}]; async.each(records, function(record, next){ saveRecord(record) .then(){ next(null); }); }, function(){ deferred.resolve(); }); function saveRecord(record){ record['activity_type'] = 'bonus'; db_module.save(record); } db_module.js ---------------- function saveRecord(record){ var deferred = q.defer(); checkDuplicate(record) .then(function(isDuplicate)){ if(!isDuplicate){ knex('employees').insert(record); deferred.resolve(); } }); } } function checkDuplicate(record){ return knex('employees') .where({'emp_id': record['emp_id']}) .then(function(rows){ return rows && rows.length > 0; }); }

Mi problema es que incluso usando async, el código no está esperando que se guarde el primer registro y luego se guarda a continuación. El resultado del código anterior en la tabla de la base de datos es:

 emp_id got_bonus ------- ---------- 3 true 3 false 3 true

la salida esperada es:

 emp_id got_bonus ------- ---------- 1 true 2 false 3 true

Intenté usar async.waterfall pero recibí el mismo error. No sé cómo usar el módulo de sincronización.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

¿Por qué no guarda sus datos de one shot vez?

 var records = [ {emp_id:1, got_bonus: true}, {emp_id:2, got_bonus: false}, {emp_id:3, got_bonus: true} ]; var modifiedRecords = records.map((i) => { return Object.assign({}, i, { activity_type : 'bouns', }) }); knex('employees') .insert(modifiedRecords) .then(()=> { /// sent response })
over 4 years ago · Santiago Trujillo Denunciar

0

Resolví este problema cambiando async.each a async.eachSeries así:

 async.eachSeries(records, function(record, next){ saveRecord(record) .then(){ next(null); }); }, function(){ deferred.resolve(); });

eachSeries es igual que each pero ejecuta solo una única operación asíncrona a la vez.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda