Запрос данных сервера. JavaScript

По адресу https://api.coincap.io/v2/assets?limit=1 есть парметр "priceUsd" с числовым значением пытаюсь получить его в консоль на http://localhost:3000 весь код

const http = require('http');
const server = http.createServer();


server.on('request', (req, res) =>{
    res.end('Hello')
   });

server.listen(3000, (error) => console.log('Server Run'));

server.addEventListener("DOMContentLoaded", () => {
    function req() {
        const request = new XMLHttpRequest();
        request.open("GET", "https://api.coincap.io/v2/assets?limit=1");
        request.setRequestHeader("Content-type", "application/json; charaset=utf-8");
        request.send();
        request.addEventListener("load" , function() {
            if (request.status == 200) {
                let data = JSON.parse(request.response);
                console.log(data);
                
            } else {
                console.error("Что-то не так");
            }
        });
    }
})
req();

Ответы (1 шт):

Автор решения: Neverm1ndo

У вас смешались браузерный и серверный код.

Вы запускаете код не в браузере. Сервер и браузер - это две разные среды, и код, который работает в одной среде, не обязательно заработает в другой.

По порядку:

  • В node.js модуле http, у класса http.Server, инстанс которого вы создаете с помощью метода http.createServer(), нет метода addEventListener(). Он из браузерного DOM API.

  • В node.js нет такого класса как XMLHttpRequest. Он есть в виде отдельно загружаемого npm модуля, и в браузерном API. Все реквесты делаются с помощью метода http.request() или других сторонних http-клиентов, например axios.

  • Ну и у вас функция req() объявлена внутри обработчика слушателя. Объявлена и никогда не будет вызвана. Вы пытаетесь вызвать ее в последней строчке, но получите req is not defined.

В вашем случае код должен выглядеть примерно так:

const http = require('http');
const https = require('https');

const server = http.createServer((_req, res) => { // создаем инстанс класса http.Server
    
    // при запросе к localhost:3000 выполнится этот колбэк  

    res.writeHead(200, { 'Content-Type': 'text/plain' }); 
    

    // опции запроса к удаленному серверу
    const options = {
        host: 'api.coincap.io',
        path: '/v2/assets?limit=1',
        method: 'GET',
        headers: {
          'Content-Type': 'application/json',
        }
      };
  
    // http запрос вернет нам 301 Permanently Moved, поэтому https
    https.request(options, (response) => {
        let str = '';
        
        // данные грузятся не одним куском, а чанками
        response.on('data', function (chunk) {
            str += chunk;
        });
        
        response.on('end', function () {
            const { priceUsd } = JSON.parse(str).data[0]; // получаем preiceUsd из ответа
            
            res.end(priceUsd); // отправляем ответ тому, кто обратился к localhost:3000
        });
    }).end();
  });

server.listen(3000, '127.0.0.1');

Добавил может быть кривоватые комменты в код, но старался, чтобы было понятно, что и для чего.

Вообще поподробнее изучите:

И если хотите работать с бэкендом, лучше начните с фреймворка типа express.js, чтобы не изобретать велосипед.

→ Ссылка