ошибка синтаксического анализа при попытке получить JSON из API - диалог потока - PullRequest
0 голосов
/ 27 октября 2018

Я пытаюсь получить данные json из iex api.Я использую встроенный редактор для диалогового потока Google, и при попытке получить JSON из API я получаю сообщение об ошибке:

Error: Parse Error
at Error (native)
at Socket.socketOnData (_http_client.js:363:20)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at readableAddChunk (_stream_readable.js:176:18)
at Socket.Readable.push (_stream_readable.js:134:10)
at TCP.onread (net.js:559:20)

Журнал консоли показывает, что я запрашиваю правильный путь, чтобы получитьзапрос json (в данном случае я хотел получить информацию о Microsoft json

API Request: api.iextrading.com/1.0/stock/MSFT/company

. Я не уверен, почему json не читается правильно, но я думаю, что ошибка происходит из-за того, что тело var моего кода неполучение информации из http запроса. Я просто не уверен, что не так с моим кодом.

Вот мой код:

'use strict';

const http = require('http');
const functions = require('firebase-functions');

const host = 'api.iextrading.com';

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((req, res)     => {
  // Get the company
  let company = req.body.queryResult.parameters['company_name']; // city is a required param

  // Call the iex API
  callCompanyApi(company).then((output) => {
    res.json({ 'fulfillmentText': output }); 
  }).catch(() => {
    res.json({ 'fulfillmentText': `I don't know this company`});
  });
});

function callCompanyApi (company) {
  return new Promise((resolve, reject) => {
    // Create the path for the HTTP request to get the company
    let path = '/1.0/stock/' + company + '/company';
    console.log('API Request: ' + host + path);

    // Make the HTTP request to get the company info
    http.get({host: host, path: path}, (res) => {
    let body = ''; // var to store the response chunks
    res.on('data', (d) => { body += d; });// store each response chunk
    res.on('end', () => {
    // After all the data has been received parse the JSON for desired data
        console.log(body);
        let response = JSON.parse(body);
        let description = response['description'];

    // Create response
        let output = `${description}`

    // Resolve the promise with the output text
        console.log(output);
        resolve(output);
      });
      res.on('error', (error) => {
      console.log(`Error calling the iex API: ${error}`)
      reject();
      });
    });
  });
}

1 Ответ

0 голосов
/ 27 октября 2018

Если вы используете редактор встроенного диалогового потока, то вы используете облачные функции для Firebase (или облачные функции Firebase). По умолчанию в базовом плане есть ограничение, согласно которому вы не можете совершать сетевые вызовы за пределами сети Google.

Чтобы обойти это, вы можете обновить свой план Firebase до подписки, такой как Blaze Plan . Это требует кредитной карты на файл, однако базовый уровень использования должен быть частью бесплатного уровня.

Вы также можете запустить свой веб-крючок где угодно, если есть веб-сервер с действующим сертификатом SSL, который может обрабатывать запросы HTTPS. Если вы хотите запустить его локально, вы даже можете использовать что-то вроде ngrok .

...