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

Ary*_*Jha 3 real-time mongoose mongodb node.js pusher

我正在尝试在 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)
Run Code Online (Sandbox Code Playgroud)

服务器.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}`))
Run Code Online (Sandbox Code Playgroud)

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

[nodemon] 2.0.4 [nodemon] 要随时重新启动,请输入rs[nodemon] 监视路径:[nodemon] 观看扩展:js,mjs,json
[nodemon] 开始node server.jsC:\Users\Desktop\Pingu - Chat App\backend\node_modules\mongoose\lib\drivers\node-mongodb-native\collection.js:145 throw new Error('集合方法 ' + i + ' 是同步的'); ^

错误:Collection 方法 watch 在 NativeCollection 上是同步的。[作为手表] (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 在 ModuleJob.run (internal/modules/esm/module_job.js:146:23) 在 async Loader.import (internal/modules) /esm/loader.js:165:24) 在 async Object.loadESM (internal/process/esm_loader.js:68:5) [nodemon] 应用程序崩溃 - 启动前等待文件更改...

这是文档docs.mongodb.com/manual/changeStreams的链接,从这里我可以得到的是,它可以通过两种方式完成:我实现了“监视”方式,但不知道如何实现异步-等待方式。

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

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

Chr*_*ews 6

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

问题是您在调用监视函数时未确保已连接到数据库。连接到 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);
);
})

Run Code Online (Sandbox Code Playgroud)

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