2 votes

Comment faire fonctionner la fonction watch() dans MongoDB ?

J'essaie de construire une application de chat utilisant Pusher pour la communication en temps réel avec l'aide de MongoDB. Voici mes fichiers.

dbMessages.js

    import mongoose from 'mongoose'

    const pinguSchema = mongoose.Schema({
        message: String,
        name: String,
        timestamp: String,
        received: Boolean
    })

    export default mongoose.model('messagecontents', pinguSchema)

server.js

import express from "express"
import mongoose from 'mongoose'
import Messages from './dbMessages.js'
import Pusher from 'pusher'

//config
const app = express()
const port = process.env.PORT || 9000

const pusher = new Pusher({
    appId: "###",
    key: "###",
    secret: "###",
    cluster: "###",
    useTLS: ###
  });

//middleware
app.use(express.json())

//DB config
const connection_url = "###";

mongoose.connect(connection_url,{
    useCreateIndex: true,
    useNewUrlParser: true,
    useUnifiedTopology: true
})

const db = mongoose.connection;

db.once("open", () => {
    console.log("DB connected...")
})

const msgCollection = db.collection("messagecontents");
const changeStream = msgCollection.watch();

changeStream.on("change", (change)=>{
    console.log(change);

//api routes
app.get('/', (req,res) => {
    res.status(200).send('hello')
})

app.get('/messages/sync', (req,res) => {
    Messages.find((err, data) => {
        if(err){
            res.status(500).send(err)
        } else{
            res.status(200).send(data)
        }
    })
})

app.post('/messages/new', (req,res) => {
    const dbMessage = req.body

    Messages.create(dbMessage, (err, data) => {
        if(err){
            res.status(500).send(err)
        } else{
            res.status(201).send(data)
        }
    })
})

//listen
app.listen(port, () => console.log(` Server running on port: ${port}`))

Ce que j'essaie d'obtenir, c'est le "changement" dans ma console, par l'API http://localhost:9000/messages/new. Mais l'erreur que j'obtiens est la suivante

[nodemon] 2.0.4 [nodemon] pour redémarrer à tout moment, entrez rs [nodemon] watch path(s) : . [nodemon] regarder les extensions : js,mjs,json
[nodemon] démarrage node server.js C:\Users\Desktop\Pingu - Chat App \backend\node_modules\mongoose\lib\drivers\node -mongodb-native \collection.js :145 throw new Error('La méthode de collecte ' + i + ' est synchrone') ; ^

Erreur : La surveillance de la méthode de collection est synchrone à NativeCollection. [as watch] ( C:\Users\Desktop\Pingu - Chat App \backend\node_modules\mongoose\lib\drivers\node -mongodb-native \collection.js :145:15) at file:///C:/Users/Desktop/Pingu%20-%20Chat%20App/backend/server.js:38:36 at ModuleJob.run (internal/modules/esm/module_job.js:146:23) at async Loader.import (internal/modules/esm/loader.js:165:24) at async Object.loadESM (internal/process/esm_loader.js:68:5) [nodemon] app crashed - waiting for file changes before starting...

Voici le lien vers la documentation docs.mongodb.com/manual/changeStreams D'après ce que j'ai compris, il y a deux façons de procéder. J'ai implémenté la méthode "watch", mais je ne sais pas comment implémenter la méthode "async-await".

Voici également le lien vers la vidéo youtube à partir de laquelle j'ai essayé d'apprendre, youtube.com/watch?v=gzdQDxzW2Tw cette partie commence à partir de l'horodatage 2:59:00

Quelqu'un peut-il m'aider ? Merci d'avance.

1voto

Chris Matthews Points 256

Je suis désolée que les commentaires que vous avez reçus n'aient été d'aucune utilité et qu'ils vous aient fait perdre votre temps. Tout le code que vous avez partagé est en fait utile pour résoudre le problème.

Le problème est que vous appelez la fonction watch sans vous assurer que vous disposez d'une connexion à la base de données. La connexion à Mongo est asynchrone, donc lorsque vous appelez la fonction watch, vous êtes peut-être encore en train d'établir une connexion à la base de données. Modifiez votre code comme suit...

const db = mongoose.connection;

db.once("open", () => {
    console.log("DB connected...");
const msgCollection = db.collection("messagecontents");
const changeStream = msgCollection.watch();

changeStream.on("change", (change) => 
    console.log(change);
);
})

J'espère que cela vous aidera. Je suis très déçu des autres commentaires reçus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X