Мой JSON .parse в приложении. js не работает должным образом - PullRequest
0 голосов
/ 07 марта 2020

app. js:

const express = require("express");
const https = require("https");
const app = express();

const port = 3000;

app.get("/",function(req,res){
  const url ="https://maps.googleapis.com/maps/api/geocode/jsonaddress=1600+Amphitheatre+Parkway,+Mountain+View,+CA&key=YOUR_API_KEY;
      console.log(response.statusCode);
    response.on("data",function(data){
      var jatin=JSON.parse(data);
      console.log(jatin);
  })
})

app.listen(port, () => console.log(`Example app listening on port ${port}!`));

Ошибка на консоли

app.listen (3000, function () {console.log ( "сервер запущен на порту 3000");})

сервер запущен на порту 3000 200 undefined: 26 "long_name"

SyntaxError: Неожиданный конец ввода JSON при JSON .parse () на входящем сообщении. (/home/jatin/Downloads/full_stack/Web-Development/maps/app.js:11:21) в IncomingMessage.emit (события. js: 189: 13) в IncomingMessage.Readable.read (_stream_readable. js: 487: 10) в потоке (_stream_readable. js: 931: 34) в резюме_ (_stream_readable. js: 912: 3) в process._tickCallback (внутренняя / process / next_tick. js: 63 : 19) Сбой приложения [nodemon] - ожидание изменений файла перед запуском

Вывод отображается, когда я запускаю его в браузере, но на консоли выдает ошибку. Для по какой-то причине JSON .parse () не работает должным образом.

Я пытаюсь выполнить вызов API геокодирования и в ответ выдает вывод JSON, который при вводе это как URL в браузере, ожидаемый вывод получен, но когда приложение. js запускается на сервере узла express и когда я нажимаю на свой локальный хост: 3000 я получаю консольную ошибку

JSON .parse ("data") работает, но неожиданно останавливается. Что приводит к ошибке.

1 Ответ

0 голосов
/ 07 марта 2020

Вам нужен код для выполнения JSON .parse для события end, как в этом примере из документации :

http.get('http://nodejs.org/dist/index.json', (res) => {
  const { statusCode } = res;
  const contentType = res.headers['content-type'];

  let error;
  if (statusCode !== 200) {
    error = new Error('Request Failed.\n' +
                      `Status Code: ${statusCode}`);
  } else if (!/^application\/json/.test(contentType)) {
    error = new Error('Invalid content-type.\n' +
                      `Expected application/json but received ${contentType}`);
  }
  if (error) {
    console.error(error.message);
    // Consume response data to free up memory
    res.resume();
    return;
  }

  res.setEncoding('utf8');
  let rawData = '';
  res.on('data', (chunk) => { rawData += chunk; });
  res.on('end', () => {
    try {
      const parsedData = JSON.parse(rawData);
      console.log(parsedData);
    } catch (e) {
      console.error(e.message);
    }
  });
}).on('error', (e) => {
  console.error(`Got error: ${e.message}`);
});

Обратите внимание, что это http.

const express = require("express");
const https = require("https");
const app = express();

const port = 3000;

app.get("/", function(req, res) {
  const url = "API_URL";
  https.get(url, function(response) {
    console.log(response.statusCode);
    let body = "";
    response.on("data", function(data) {
      body += data;
    });

    response.on("end", function() {
      console.log(JSON.parse(body));
    });
  });
  res.end("End data response");
});

app.listen(port, () => console.log(`Example app listening on port ${port}!`));

в основном .on('end', callback') и .on('data', callback') являются прослушивателями событий data приема и запроса end событий и могут обрабатывать ответ на запросы в узле, когда используя http(s).get, вы должны прикрепить прослушиватель событий к событию data, которое вызывается каждый раз, когда ваш запрос получает фрагмент ответа на запрос, и как только запрос завершается службой, вызывается событие end, сообщающее, что больше не запрашиваются данные с сервера, следовательно запрос завершен.

, как указано в документации :

Обратный вызов должен позаботиться о том, чтобы использовать данные ответа по причинам, указанным в ht tp.ClientRequest раздел.

...