Estoy practicando Node.js y estoy creando un sitio web donde la gente puede votar cosas y luego obtener los resultados. Los votos se realizan utilizando la ruta POST /coffeeorwater que luego redirige a la ruta /results1 que muestra los resultados.
El problema = los votos van del formulario en la interfaz a Node a MongoDB y de regreso a Node y luego a la ruta /results1, pero a veces los números de votos que se muestran están detrás de los números que están en la base de datos.
Creo que tiene algo que ver con la naturaleza asincrónica de Node o tal vez con la forma en que configuré las rutas, ya que los datos deben enviarse y luego regresar rápidamente.
Lo que he intentado hasta ahora es buscar cosas como "datos que regresan usando Node que no se actualizan inmediatamente" y "retraso en el recuento al devolver datos de MongoDB", pero no he encontrado la solución. Soy totalmente autodidacta, así que pido disculpas si algo de esto es obvio o debería haber sido encontrado fácilmente.
const express = require('express'); const application = express(); const mongoose = require('mongoose'); const bodyParser = require('body-parser'); application.set('view engine', 'ejs'); application.use(bodyParser.urlencoded({ extended: true })); application.use(express.json()); mongoose.connect(process.env.DATABASE_PASSWORD) .then(console.log('Database connected')); const db = mongoose.connection; application.get('/', (request, response) => { response.render('index', { data: '1234', }); }); application.post('/coffeeorwater', async (request, response, next) => { const choice = request.body.coffeeorwater; const updatevotes = async () => { if (choice == 'coffee') { db.collection('data').update( { question: 'coffeeorwater' }, { $inc: { coffeevotes: 1 } } ) } if (choice == 'water') { db.collection('data').update( { question: 'coffeeorwater' }, { $inc: { watervotes: 1 } } ) } }; await updatevotes(); console.log('POST made'); response.redirect('/results1'); }); application.get('/results1', async (request, response) => { const results = await db.collection('data').findOne({ question: 'coffeeorwater' }); response.render('results1', { coffeevotes: results.coffeevotes, watervotes: results.watervotes, }); }); application.listen(8080, () => { console.log('Listening here'); });para db.collection('data').update en primer lugar, no es un método asíncrono, por lo que puede usar la devolución de llamada para obtener el resultado O usar mongoose mongoose Model.updateOne
verifique esta referencia nodejs_mongodb_update
NOTA: - si todavía tiene un problema, mencione en el comentario, le daré un ejemplo
Podrías usar Model.findOneAndUpdate
Código de ejemplo:
Model.findOneAndUpdate({[donde condiciones]}, {[datos para actualizar]}, {[opciones]}, función de devolución de llamada());
El modelo podría ser cualquier modelo de mangosta.
opciones =>
-> nuevo: booleano (verdadero/falso), predeterminado: falso; si se establece en verdadero, devuelve el documento actualizado