Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

179
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!