#node.js
#node.js
Вопрос:
У меня есть простой запрос HTTPS — https://api.pro.coinbase.com/products/btc-eur/ticker
В браузере это возвращает один объект. Какой самый простой код, который позволит мне извлекать и отображать этот объект (как есть) в терминале узла?
const https = require('https')
const url = https.get('https://api.pro.coinbase.com/products/btc-eur/ticker')
const myObject = JSON.parse(url)
console.log(myObject)
Простое копирование / вставка приведенного выше кода в VSC возвращает ошибку SyntaxError: неожиданный токен o в JSON в позиции 1.
Комментарии:
1. Не могли бы вы объяснить проблему немного подробнее? Что дает ваше текущее решение и чего вы ожидаете?
2. Привет, этот код выдает мне «неожиданный токен o в JSON в позиции 1». Если я регистрирую в консоли только URL-адрес, я получаю милю данных, связанных с объектом, но не с самим объектом. Я хочу отобразить массив со всеми значениями, отображаемыми в браузере.
3. У меня такое чувство, что мне нужно создать объект запроса, который включает заголовок ‘user-agent’, но я еще не рассмотрел это, только то, что я прочитал. На данный момент объект анонимный.
Ответ №1:
@mamba76, добро пожаловать в сообщество SO. Пожалуйста, используйте Node.js node-fetch
посылка. Это намного проще в использовании. Вы можете установить его с помощью npm install
.
Следующий код может помочь:
"use strict";
const fetch = require('node-fetch')
async function getValue() {
// Invoke the API.
// Wait until data is fetched.
let response = await fetch('https://api.pro.coinbase.com/products/btc-eur/ticker');
let value = await response.json();
return value;
}
getValue().then(result => {console.log(result.price);});
В качестве хорошей практики всегда предполагайте, что вызовы API через HTTP (будь то в вашей собственной сети или за ее пределами) могут потребовать времени для возврата данных, и, следовательно, вы должны использовать async-await
шаблон для выполнения этих запросов.
Комментарии:
1. Большое спасибо, Прасад! Это именно то, что мне нужно было сделать. Когда вы преодолеваете такие препятствия, это просто вдохновляет меня учиться еще больше. Функция ‘await’ еще не использовалась, но выглядит проще, чем метод ‘data = data chunk’, изученный до сих пор.
2. В примере Прасада, как я могу сохранить объект (результат) или значение (result.price) в виде массива или переменной соответственно, чтобы эти данные можно было использовать или экспортировать как обычные объекты / переменные?
3. Похоже, что я ищу что-то простое, но когда я пытаюсь назначить ‘const MyObject = result’, я продолжаю получать ‘MyObject не определен’?
4. Лучше всего открыть новый вопрос или продолжить отсюда?
5. Я пересматриваю свои вопросы, чтобы узнать, смогу ли я помочь другим дальше теперь, когда я понимаю, что такое Stack! Я предполагаю, что этот вопрос был отклонен, поскольку я не дал выходных данных. Я предположил, что кому-то будет легко скопировать / вставить текст в VSC, а также, что если бы у вас не было VSC, вы бы все равно не поняли, что будет означать ошибка! Поэтому был бы признателен, если бы кто-нибудь поддержал мой вопрос, если бы это помогло вам. Может показаться, что вы направляетесь в стаю волков, вооруженных только ложкой, когда ваш новичок пытается получить помощь здесь!
Ответ №2:
Расширение @Akshay.Ответ N и без использования внешних зависимостей,
const https = require('https')
https.get("https://api.pro.coinbase.com/products/btc-eur/ticker",res=>{
let body = '';
res.on('data', (chunk) => { body = chunk; });
res.on('end', () => {
const myObject = JSON.parse(body);
console.log(myObject);
})
})
Теперь, что мы здесь делаем, это ждем data
события, пока поступают данные, и добавляем его в переменную body
. Как только end
событие обнаружено, мы воспринимаем это как сигнал о том, что все данные получены, и мы можем приступить к анализу тела в объект, используя JSON.parse
(предполагая, что данные были сериализованы в JSON; если это не так JSON.parse
, будет выдана ошибка).
Этот урок полезен: https://davidwalsh.name/nodejs-http-request
Ответ №3:
попробуйте что-то вроде этого:-
https.get("https://api.pro.coinbase.com/products/btc-eur/ticker",res=>{
res.on('data', (chunk) => { console.log(JSON.parse(chunk))})
})
Комментарии:
1. Спасибо, Акшай, это более простая версия аналогичного материала, который я прочитал, но снова требуется заголовок пользовательского агента. Похоже, этот запрос нужно несколько разбить. Я еще немного почитаю..
2. @Akshay. N Вы пропускаете
end
событие. Ознакомьтесь с моим ответом.3. Спасибо, ребята. Поправка Акашдипа очень похожа на то, как я учусь, разбивая ее, чтобы ее было легче понять. Я знал, что существуют разные способы достижения одного и того же результата, поэтому я вернусь к этому для справки.
4. Хотя исправленный код по-прежнему выдает сообщение терминала «Требуется заголовок User-Agent»
Ответ №4:
С помощью узла (вам нужен модуль запроса) :
// display object
(require("request")).get({
url: "myurl",
json: true
}, function(e,r,b){
console.log(b);
});
// display as string
(require("request")).get({
url: "myurl",
json: false
}, function(e,r,b){
console.log(b);
});
С помощью только curl в вашем терминале (без узла)
curl myurl
Комментарии:
1. Было бы легче понять, если бы вы объяснили, что для кода требуется
request
модуль, и если бы весь код не был в одной строке. Может быть сложно распаковать для кого-то, кто заново изучает узел, например, OP.