API, который будет постоянно возвращать данные - PullRequest
0 голосов
/ 28 ноября 2018

Здесь я начинаю, я использую базу данных Firebase в реальном времени, и мне нужно, чтобы мой API постоянно возвращал это значение, когда что-то было добавлено, см. Мой код ниже.

apiCalls.get('/api/getallusers',function(req,res){
  userFunc.getAllUsers(function(err,result){
    if (err) return res.status(500).send('internal server error!');
    res.status(200).write(JSON.stringify(result));
    res.end();
    return res;
  })
})

это вернет ошибку

Error [ERR_STREAM_WRITE_AFTER_END]: write after end

, но если я удалю res.end, он покажет 1 запись и будет постоянно загружаться до истечения времени ожидания страницы.

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

также я использую облачные функции Firebase для этого API.

ОБНОВЛЕНИЕ:

ЗагруженоAPI, но он ничего не возвращает ...

вот ссылка https://us -central1-testproject-e6819.cloudfunctions.net / api1 / api / getUser

пробный axios и источник события

Функции Firebase записывают значения, но не возвращают их ..

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Операции в облачных функциях должны быть относительно недолговечными и заканчиваться детерминистически.Невозможно сохранить соединение между облачными функциями и клиентом открытым.

Обычно учитывают, что вызывает необходимость отправки новых данных.Например, если это вызвано тем фактом, что новый пользователь зарегистрирован, вы можете использовать запуск облачных функций из Firebase Authentication .Затем функция может, например, записывать данные в базу данных реального времени (или в облачное хранилище Firestore), а ваш клиент / приложение прослушивает базу данных для обновлений в реальном времени.Таким образом, вы используете все компоненты Firebase так, как они предназначены: облачные функции для краткосрочных обновлений, инициируемых событиями в системе, и база данных реального времени или облачное хранилище для отправки обновлений в реальном времени.

Если это не работает для вашего варианта использования, вам потребуется среда выполнения, которая позволит вам поддерживать процессы в рабочем состоянии.Для этого на ум приходит что-то вроде App Engine flex, Kubernetes или многих других.

0 голосов
/ 28 ноября 2018

Если вы просматриваете ответ API как веб-страницу, ваш браузер буферизирует полученные данные, пока их не станет достаточно, чтобы сформировать более полную страницу.Ваш браузер ожидает окончания содержимого, а не какого-то бесконечного потока данных.

Вам следует удалить .end(), если вы ожидаете, что сможете продолжить запись в выходной поток.

Кроме того, я рекомендую использовать для этого протокол Server-Sent Events (SSE).https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events Он предоставляет хорошую основанную на стандартах абстракцию, которая позволяет очень легко обрабатывать потоки событий на стороне клиента.

const eventSource = new EventSource('https://api.example.com/someApi');
eventSource.addEventListener('userupdate', (e) => {
  console.log(e.data);
});

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

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