Я пытаюсь написать некоторый код nodejs, который работает с работающей в данный момент базой данных MongoDB, настроив поток изменений и (используя библиотеку веб-сокетов ws ) перенаправляет эти изменения подключенным клиентам.
Я следовал этому руководству , чтобы создать исходный код изменения монго, который работает:
conn = new Mongo("mongodb://localhost:27017/demo?replicaSet=rs");
db = conn.getDB("demo");
collection = db.stock;
const changeStreamCursor = collection.watch(
[{
$match: {
$or: [
{ operationType: "update" },
{ operationType: "insert" }
]
}
}],
{
fullDocument: 'updateLookup'
}
);
pollStream(changeStreamCursor);
out each change as it comes in
function pollStream(cursor) {
while (!cursor.isExhausted()) {
if (cursor.hasNext()) {
change = cursor.next();
print(JSON.stringify(change));
}
}
pollStream(cursor);
}
Затем я запускаю этот файл со скриптом Монго:
~/Mongo/bin/mongo change-stream-socket-server.js
Итак, я в основном хочу использовать этот код выше, но добавить веб-сокеты и вызвать ws.send()
вместо того, чтобы просто вносить изменения в консоль.
Проблема, однако, в том, что мне кажется, что я не могу использовать «require» в файле javascript, выполняемом скриптом mongo. Есть ли какой-нибудь способ добавить в нее зависимость ws или использовать require?
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8040 });
conn = new Mongo("mongodb://localhost:27017/");
db = conn.getDB("demo");
collection = db.stock;
const changeStreamCursor = collection.watch(
[{
$match: {
$or: [
{ operationType: "update" },
{ operationType: "insert" }
]
}
}],
{
fullDocument: 'updateLookup'
}
);
console.log('also setting up websockets...')
wss.on('connection', function connection(ws) {
wss.clients.forEach(function each(client) {
pollStream(changeStreamCursor);
function pollStream(cursor) {
while (!cursor.isExhausted()) {
if (cursor.hasNext()) {
change = cursor.next();
print(JSON.stringify(change));
client.send(JSON.stringify(change))
}
}
pollStream(cursor);
}
});
});
console.log('server running, waiting for connections...')
Когда я запускаю его с mongo, я получаю этот вывод с ошибкой «require is notfined»:
Версия оболочки MongoDB v3.6.4 для подключения к: mongodb: //127.0.0.1: 27017
Версия сервера MongoDB: 3.6.4 2018-10-28T21: 23: 53.515-0400 E QUERY
[thread1] ReferenceError: требование не определено:
@ change-stream-socket-server.js: 2: 7 не удалось загрузить:
изменить-поток-сокета server.js * +1025 *
Если я пытаюсь просто запустить его с «узлом» и файлом, я получаю ошибку, что Mongo не определен. Я попытался подключиться к нему, используя "MongoClient" с кодом ниже, но это также не сработало для меня.
const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');
const url = 'mongodb://localhost:27017';
const dbName = 'demo';
const client = new MongoClient(url);
client.connect(function(err) {
assert.equal(null, err);
console.log("Connected successfully to server");
const db = client.db('demo');
const changeStreamCursor = db.collection('stock').watch();
pollStream(changeStreamCursor);
function pollStream(cursor) {
while (!cursor.isExhausted()) {
if (cursor.hasNext()) {
change = cursor.next();
print(JSON.stringify(change));
}
}
pollStream(cursor);
}
});
Приведенный выше код выдает мне сообщение с ошибкой: «cursor.isExhausted не является функцией»:
(узел: 4590) Предупреждение об устаревании: текущий синтаксический анализатор строки URL
устарела и будет удалена в следующей версии. Чтобы использовать новый
parser, передать параметр {useNewUrlParser: true} в MongoClient.connect.
Успешно подключен к серверу
/Users/jim/Git-Projects/MongoDB-Change-Streams-Example/node_modules/mongodb/lib/operations/mongo_client_ops.js:466
бросить ошибку;
^
TypeError: cursor.isExhausted не является функцией
в pollStream (/Users/jim/Git-Projects/MongoDB-Change-Streams-Example/basic-mongo-changesream-watcher.js:68:17)
в /Users/jim/Git-Projects/MongoDB-Change-Streams-Example/basic-mongo-changesream-watcher.js:47:2
в результате (/Users/jim/Git-Projects/MongoDB-Change-Streams-Example/node_modules/mongodb/lib/utils.js:414:17)
в executeCallback (/Users/jim/Git-Projects/MongoDB-Change-Streams-Example/node_modules/mongodb/lib/utils.js:406:9)
по ошибке (/Users/jim/Git-Projects/MongoDB-Change-Streams-Example/node_modules/mongodb/lib/operations/mongo_client_ops.js:286:5)
в connectCallback (/Users/jim/Git-Projects/MongoDB-Change-Streams-Example/node_modules/mongodb/lib/operations/mongo_client_ops.js:241:5)
в process.nextTick (/Users/jim/Git-Projects/MongoDB-Change-Streams-Example/node_modules/mongodb/lib/operations/mongo_client_ops.js:463:7)
в _combinedTickCallback (внутренняя / process / next_tick.js: 131: 7)
at process._tickCallback (internal / process / next_tick.js: 180: 9)
Можно ли мне как-нибудь использовать моно-моно-изменения и библиотеку веб-сокетов ws? Спасибо!