如何让 watch() 函数在 mongoDB 中工作?

How to make watch() function work in mongoDB?

我正在尝试在 MongoDB 的帮助下使用 Pusher 构建一个聊天应用程序以进行实时通信。这些是我的文件。

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}`))

我想要得到的是我的控制台中的 'change',通过 API http://localhost:9000/messages/new 但是我得到的错误是

[nodemon] 2.0.4 [nodemon] to restart at any time, enter rs [nodemon] watching path(s): . [nodemon] watching extensions: js,mjs,json
[nodemon] starting node server.js C:\Users\Desktop\Pingu - Chat App\backend\node_modules\mongoose\lib\drivers\node-mongodb-native\collection.js:145 throw new Error('Collection method ' + i + ' is synchronous'); ^

Error: Collection method watch is synchronous at 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...

这是文档 docs.mongodb.com/manual/changeStreams 的 link 从这里我可以得到的是它可以通过两种方式完成 我实现了 'watch' 方式,但不要知道如何实现异步等待方式。

这里还有 link 我试图学习的 youtube 视频,youtube.com/watch?v=gzdQDxzW2Tw 这部分从时间戳开始 2:59:00

有人可以帮忙吗?提前致谢。

很抱歉,您收到的评论完全没有帮助而且浪费时间。您共享的所有代码实际上都有助于解决问题。

问题是您在调用监视函数时未确保已连接到数据库。连接到 mongo 是异步的,因此当您调用 watch 函数时,您可能仍处于建立数据库连接的过程中。像这样修改你的代码...

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);
);
})

希望对您有所帮助。我对收到的其他评论感到非常失望。