【问题标题】:How to make watch() function work in mongoDB?如何使 watch() 函数在 mongoDB 中工作?
【发布时间】:2021-03-01 22:40:45
【问题描述】:

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

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

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

[nodemon]2.0.4 [nodemon]随时重启,输入rs[nodemon] 观看路径:. [nodemon] 观看扩展:js,mjs,json
[nodemon] 开始node server.js C:\Users\Desktop\Pingu - 聊天 应用\后端\node_modules\mongoose\lib\drivers\node-mongodb-native\collection.js:145 throw new Error('收集方法' + i + '是同步的'); ^

错误:集合方法 watch 是同步的 在 NativeCollection。 [作为手表] (C:\Users\Desktop\Pingu - 聊天 应用\后端\node_modules\mongoose\lib\drivers\node-mongodb-native\collection.js:145:15) 在 file:///C:/Users/Desktop/Pingu%20-%20Chat%20App/backend/server.js:38:36 在 ModuleJob.run (internal/modules/esm/module_job.js:146:23) 在异步 Loader.import (internal/modules/esm/loader.js:165:24) 在异步 Object.loadESM (internal/process/esm_loader.js:68:5) [nodemon] 应用程序崩溃 - 在启动前等待文件更改...

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

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

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

【问题讨论】:

  • 文档是怎么说的?
  • 请将错误的完整堆栈跟踪添加到问题中。
  • @D.SM添加了错误和文档。
  • 在我看来不像完整的堆栈跟踪。
  • @D.SM 添加更多信息,使用 nodemon 命令。

标签: node.js mongodb mongoose real-time pusher


【解决方案1】:

很抱歉,您获得的 cmets 完全没有帮助,而且是在浪费时间。您分享的所有代码实际上都有助于解决问题。

问题是您在调用 watch 函数时没有确保您已连接到数据库。连接到 mongo 是异步的,所以当你调用 watch 函数时,你可能还在建立一个 db 连接的过程中。像这样修改你的代码......

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

我希望这会有所帮助。我对收到的其他 cmets 感到非常失望。

【讨论】:

  • 您好,我没有在前端获取数据。我在 changeStrea 上使用过 io.emit 、 socket.io ,在前端, io.on 不显示数据 :(
猜你喜欢
  • 1970-01-01
  • 2015-03-17
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
相关资源
最近更新 更多