Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

180
Visualizações
Funciones en la nube: la transacción de la base de datos en tiempo real no funciona con la condición

Estoy tratando de disminuir la amount de campo que representa la cantidad de productos disponibles para la venta.

Mi base de datos está estructurada de la siguiente manera:

 - Stock - StoreId - DepartmentId - ProductId + price + amount

Mi storeId tiene un valor fijo y solo estoy recorriendo las variables DepartmentId y ProductId .

A continuación se muestra cómo creé una matriz de nodos o una matriz de niños para la transacción :

 const childArray = []; depIds.forEach(depId => { const prodIds = groupedProducts[depId].reduce((acc, val) => [...acc, val.prodId], []); prodIds.forEach(prodId => { childArray.push(admin.database().ref("Stock") .child(storeId) .child(depId) .child(prodId) .child("amount") .once('value')); }); });

Cuando agrego la condición: amount > 0 , no pasa nada. Solo funciona cuando elimino la condición.

 const snapshots = await Promise.all(childArray); snapshots.forEach(snapshot => { snapshot.ref.transaction(amount => { //if (amount) return amount + admin.database.ServerValue.increment(-1); if (amount > 0) return amount - 1; }) })

Además, lo que realmente necesito es comparar la cantidad en la base de datos con la cantidad que proviene de la solicitud (llamémosla cantidad)

Para esto, tendría que recuperar la ruta actual para productId y departmentId . Pero como se muestra a continuación, snapshot.ref.parent no devuelve la ruta.

 snapshots.forEach(snapshot => { snapshot.ref.transaction(amount => { //if (amount > 0 & amount >= qty) return amount + admin.database.ServerValue.increment(-qty); const productPath = snapshot.ref.parent; const departmentPath = snapshot.ref.parent.parent; // Get qty based on productPath and departmentPath if (amount > 0 & amount >= qty) return amount - qty; }) })

Entonces, tengo tres preguntas:

  1. Cómo recuperar las rutas actuales para departmentId y productId
  2. Cómo actualizar el monto del campo en función de una condición y cancelar toda la transacción si no se cumple alguna condición
  3. Cómo hacer que admin.database.ServerValue.increment(-qty) funcione

Agradezco cualquier ayuda!

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

No necesita una transacción para esto. En cambio, una vez que conozca la ruta completa de los nodos para actualizar, puede usar increment() y luego usar reglas de seguridad para validar que el valor no sea inferior a 0.

Así que en código sería:

 admin.database().ref("Stock") .child(storeId) .child(depId) .child(prodId) .update({ "amount", admin.database.ServerValue.increment(-1));

Y luego en las reglas:

 { "rules": { "Stock": { "$storeId": { "$depId": { "$prodId": { "amount": { ".validate": "newData.val() >= 0" } } } } } } }
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda