Как прослушивать и подписываться на HTTP-события с помощью NodeJS?

#node.js #http #axios

#node.js #http #axios

Вопрос:

Я пытаюсь создать счет-фактуру, а затем отслеживать ее статус, подписавшись на события. Для этого я использую bitpay REST API, и я уже успешно создал счет-фактуру и успешно извлек токен шины.

Это то, что говорится в документах bitpay:

 Once you have retrieved the bus pass, It's pretty simple. Send a GET request to the path configured for the bus - let's say it's bitpay.com/events including the appropriate parameters:

?token= - your "bus pass" retrieved from the API
amp;action= - usually "subscribe", but options are provided in your bus pass
amp;events[]= - an array of events to listen for (also provided in the bus pass)
Once you've opened the connection, you'll want to listen for chunks of data to be passed to you. Each chunk represents an event. Since the bus adheres to the SSE/EventSource specification, chunks are passed back in the format:

event: <event_type>

data: {"some":"json"}
 

Как мне прослушивать эти события? Когда я нажимаю на ссылку, которую я пытаюсь прослушать, я вижу вот что:

 :                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
retry: 2000
event: connect
data: {"status":"subscribed","resource":"Sg9hggVxgC1VTKsGYqNyVT","facade":"public/invoice","events":["payment","confirmation","paymentRejected","scanned","paymentPosted"]}

event: state
data: {"url":"https://test.bitpay.com/invoice?
...
 

Herre — это то, что я пробовал:

 const evtSource = new EventSource('<path>');

evtSource.onmessage = (e) => {
    console.log(e);
}
 

и

 axios({
    url : '<path>',
    method: 'get',
    connect: function(event){
        console.log(event);
    }
})
 

Спасибо!

РЕДАКТИРОВАТЬ: Вот пример ссылки на то, что я хочу прослушать.

Комментарии:

1. Вы должны дождаться обратного вызова, например, так: axios.get(‘/user?ID=12345’) .затем(function (response) { // обрабатывать успешную консоль.log(response); })

Ответ №1:

Вот рабочий пример Codesandbox demo https://codesandbox.io/s/gifted-borg-365z2?file=/app.js:0-496

 const EventSource = require("eventsource");
const eventSourceInitDict = { https: { rejectUnauthorized: false } };

const evtSource = new EventSource(
  "https://test.bitpay.com/events?token=767cdhmwtn7XgW1QrSkuEweXC3dUyCRcZqwvcGRvSeaDZh8UXj9aCcS1xPPppjaFYHamp;action=subscribeamp;events[]=paymentamp;events[]=confirmationamp;events[]=paymentRejectedamp;events[]=scannedamp;events[]=paymentPosted",
  eventSourceInitDict
);

evtSource.addEventListener("connect", function (e) {
  console.log("connect", e.data);
});


LOGS: connect {"status":"subscribed","resource":"HZxbCd5YRWnWJ4kK72DBai","facade":"public/invoice","events":["payment","confirmation","paymentRejected","scanned","paymentPosted"]
 

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

 evtSource.addEventListener("payment", function (e) {
  console.log("payment", e.data);
});
 

Попробуйте вместо:

 const evtSource = new EventSource('<path>');
evtSource.onmessage = (e) => {
    console.log(e);
}
 

Обновлено: https://developer.mozilla.org/en-US/docs/Web/API/EventSource

   const sse = new EventSource('<path>');
  sse.addEventListener('<event>', function(e) { 
    console.log(e.data)
  });
 

Комментарии:

1. Я уже пробовал это. Он не вызывает ни одну из моих функций .then или .catch. Также может быть полезно, если я приведу пример ссылки: https://test.bitpay.com/events?token=767cdhmwtn7XgW1QrSkuEwoYea8TVZmkK8XZxJPjKiVFiqMuYL1rnXMDmK964Euds3amp;action=subscribeamp;events[]=paymentamp;events[]=confirmationamp;events[]=paymentRejectedamp;events[]=scannedamp;events[]=paymentPosted

2. Я знаю, как делать регулярные запросы GET. Просто я понятия не имею, как подписаться и прослушать события. Если вы перейдете по ссылке, которую я предоставил, вы сможете увидеть такие события, как connect или state. Я хочу передать обратные вызовы, которые вызываются при возникновении этих событий.

3. Вашему узловому серверу может потребоваться маршрут для прослушивания таких событий, как app.get(‘/ events’, eventsHandler); Эти события являются отправленными на стороне сервера событиями, для которых вам нужен сервер, прослушивающий их. Простой вызов axios не будет работать. expressjs.com/en/starter/hello-world.html

4. Это может помочь github.com/EventSource/eventsource

5. что я сделал не так в своей попытке? Я использовал тот же модуль, как вы можете видеть в моем вопросе.