Обновление данных в реальном времени в веб-приложении MERN
Я подал заявку на роль веб-разработчика MERN Stack в стартап-компанию, и мне нужно было выполнить задачу за 2 дня. Задача заключалась в обновлении данных веб-сайта в режиме реального времени из базы данных. Во-первых, я сделал обходной путь, чтобы регулярно обновлять свой реагирующий компонент, чтобы axios мог вызывать серверный API для обновления данных. Это самый неэффективный способ обновления данных. В конце концов я решил использовать socket.io для создания соединения в реальном времени.
Читая блоги, я обнаружил, что если я слежу за ними, мне нужно полностью изменить серверную часть веб-приложения. Все блоги использовали сокет только для создания соединения с серверной частью, но я уже использовал экспресс для создания соединения. Я просмотрел разные блоги, а затем решил просмотреть документацию, чтобы узнать, как работает сокет. Я обнаружил, что могу использовать экспресс для создания порта и передать путь к серверу функции сокета для подключения моего сокетного соединения к экспрессу.
Вот код бэкэнда для сокета: -
var data = require (‘./ fetch.js’);
const server = app.listen (порт, функция () {
console.log (‘работает на локальном хосте:‘ + порт);
});
const io = require (‘socket.io’) (server);
io.on ('connection', (client) = ›{
client.on ('getData', (interval) =› {
console.log ('клиент подписывается на таймер с interval ', interval);
setInterval (() = ›{
MongoClient.connect (' MONGO_URI ', function (err, db) {
if (err) {
throw err;
client.emit ('data', err);
} else {
data.getData (db, (err, result) = ›{
if (err) {
client.emit ('данные', ошибка);
} else {
ans = result;
client.emit ('data', ans);
}
});
}
db.close ();
});
}, интервал);
});
});
Сокет подключается к mongo, чтобы получить данные из коллекции и передать их клиенту. В приведенном выше коде fetch.js - это API, написанный для получения данных для формирования любой коллекции Mongo. Код для fetch.js выглядит следующим образом: -
module.exports = {
getData: function (db, cb) {
попробовать {
vardatabase = db.db (‘balon_parkplatz’);
varcollection = database.collection (‘hyderabad’);
collection.find (). toArray (функция (ошибка, результаты) {
если (ошибка) {
метатель;
} еще {
cb (результаты);
}
});
}
catch (ошибка) {
cb (ошибка);
}
}
}
Следующим шагом было заставить клиент выдавать getData, который будет перехвачен внутренним сокетом. Чтобы отреагировать, я использовал socket.io-client, чтобы передать "getData" бэкэнду. Код для сокета в сочетании с реакцией приведен ниже: -
импортировать openSocket из socket.io-client;
const socket = openSocket (‘ http: // localhost: 8000 ‘);
function getStatus (cb) {
socket.on ('data', Parking_status = ›cb (null, Parking_status));
socket.emit ('getData', 2000);
}
экспортировать getStatus по умолчанию;
Приведенный выше код отправляет «getData» клиенту и получает «данные», которые отправляются с сервера для создания соединения в реальном времени между серверной частью и внешним интерфейсом.