Как использовать потоки изменений MongoDB с node js через микросервис REST API (построен с Express) - PullRequest
1 голос
/ 21 апреля 2020

Я использую реакцию js для создания веб-интерфейса для веб-сайта. Сервер express (который является микросервисом) находится между внешним интерфейсом и MongoDB. Я совершаю Ax ios звонки с сервера js на express (URL = http://localhost: 5688 / chat ), используя GET, POST, PUT, когда и где это необходимо.

что-то вроде ниже

Клиентская сторона

var resp = axios.get(`http://localhost:5688/chat`);
resp.then((response) => {
this.setState({data: response.data})
})

Серверная сторона

приложение. js

var app = express();

app.get('/chat', function (req, res) {
    try {
        var MongoClient = require('mongodb').MongoClient;
        var url = '***********';
        MongoClient.connect(url, { useUnifiedTopology: true }, function(err, client) {
             if (err){
                console.log('error occured while connection to databse ' + err);
             }
             else{
                db.collection(collectionName).find({}).toArray(function(err, result){
                    if (err) {throw err;}
                    else{
                        client.close();
                        res.join(result); // the result would contain the data fetch from db and will be returned to my axios call
                    }
                });
            }
        });
    }
    catch (ex) {
        res.json(ex);
    }
});

app.listen(5688, function(){
    console.log('Server listening at http://localhost:5688');
});

Выше описан способ, которым я реализовал ПОЛУЧИТЬ звонок. Точно так же я реализовал методы POST и PUT.

PS: я удалил много промежуточного кода, который не очень полезен для этого вопроса

Теперь я хочу использовать MongoDB change stream для прослушивания всех изменений, которые происходят с моей коллекцией на MongoDB. Мне известны учебные пособия, в которых показано, как можно регистрировать обновленные документы на сервере express ..... например, это учебное пособие . Это позволяет моему express серверу получать все обновленные документы при изменении данных в моей БД.

Но в чем я не уверен, так это в том, как я могу передать эти новые данные своему клиенту, чтобы я мог обновить состояние моего реагирующего компонента этими новыми данными.

Как сделать так, чтобы мой код внешнего интерфейса, сидящий в моем браузере, непрерывно прослушивал мой express сервер (REST API), который уже непрерывно прослушивает все изменения в MongoDB с помощью потоков изменений?

Является ли сокет единственным способом заставить моего клиента постоянно слушать мой сервер? если да, то как мне передать новые данные, поступающие из потоковой передачи MongoDB, в сокет на express сервере

Пожалуйста, дайте мне знать, если я должен предоставить более подробную информацию. Большое вам спасибо.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Является ли сокет единственным способом заставить моего клиента слушать мой сервер?

Ну, да. соединение с сокетом - единственный способ, которым вам нужно будет использовать что-то вроде socket.io или другую реализацию сокета.

Однако концепция nodejs противоположна поддержанию socket соединений, поскольку это может стать дорогостоящим при увеличении количества ваших соединений.

Мне кажется, что более надежное решение - обратиться к серверу. каждые x секунд (2-3?) «вносятся изменения», и если это так, обновляйте представление.

С учетом сказанного, в зависимости от точного состояния сохранения в приложении, это может быть нежизнеспособным, поскольку решение.

1 голос
/ 21 апреля 2020

Я приведу вам пример из собственного проекта в производстве:

//Server-side

//Assume tweetDB is the DB 
//Assume you have socket.io setup

//MongoDB Change Stream
const changeStream = tweetDB.watch();


changeStream.on('change', (changes) => {

//Add a event emitter
            socket.compress(true).emit('mongoStream',changes);

        });


//Client-side in a js file or a script tag
//Assuming you have established a WebSocket connection already

//Add an event listener to listen for back end changes. 

socket.on('mongoStream',data=>{
console.log(data)

});

//Note: Socket.io is event-driven.

//Add an event emitter
socket.emit('eventName','dataToEmit');

//Add an event listener
socket.on('eventName',data=>{

//Process the data here

});


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