如何让 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);
);
})
希望对您有所帮助。我对收到的其他评论感到非常失望。
我正在尝试在 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] startingnode 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);
);
})
希望对您有所帮助。我对收到的其他评论感到非常失望。