Как я могу использовать mongo changestreams и ws websockets в одном файле node.js? - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь написать некоторый код 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? Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...