Как получить json с сервера nodejs?

Ниже показан интерфейс с react и backend с nodejs / expresjs. Я могу правильно передать данные в серверную часть, но когда я пытаюсь загрузить данные в свой интерфейс, это постоянно дает мне

SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data[Learn More]"

Но раньше я использовал аналогичный формат, и у меня не было проблем. Может ли кто-нибудь дать мне совет по этому поводу?

Спасибо!

внешний интерфейс

import React from 'react';

export default () => {
  let images = fetch('http://localhost:3000/datastore', {
    mode: "no-cors", // no-cors, cors, *same-origin
    cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached
    credentials: "same-origin", // include, same-origin, *omit
  })
  .then(response => response.json());

  console.info(images);

  images.forEach((u, i) => {
    console.info(images[i])
  });

  return <div>

  </div>
}

бэкэнд

var express = require('express');
var router = express.Router();
let Datastore = require('@google-cloud/datastore')
const datastore = Datastore();
const query = datastore.createQuery('image');

router.get('/', function(req, res, next){
  datastore
  .runQuery(query)
  .then(results => {
    let tasks = results[0];
    console.info('Tasks:');
    tasks.forEach(task => {
        const taskKey = task[datastore.KEY];
        console.info(taskKey.id, task);
    });
    console.info(tasks);
    return res.send(tasks);
  })
  .catch(err => {
    console.error('ERROR:', err);
    return res.status(200).send({
        success: false
    });
  });
});

module.exports = router;

Как выглядит JSON конечной точки?

Tyler Sebastian 22.08.2018 20:54

также похоже, что задачи переходят от массива object к string случайным образом?

Tyler Sebastian 22.08.2018 20:55

Раньше он был у меня как объект, и он по-прежнему давал мне ту же ошибку

anon 22.08.2018 20:58

перейдите в / curl http://localhost:3000/datastore и вставьте ответ в свой вопрос, пожалуйста.

Tyler Sebastian 22.08.2018 21:00

я получаю следующее, когда скручиваю [{"user": "joeshmo", "description": ["лицо", "выражение лица", "голова", "волосы на лице", "джентльмен", "коллаж", "улыбка») "]," image_address ":" .... ", ‌" translation ": [" 面对 ", ‌" 表情 "," 头 "," 胡子 "," 绅士 "," 大学 ", "微笑"]}, ....]

anon 22.08.2018 21:08

Почему бы не опубликовать то, что вы получите в ответ, когда получите сообщение об ошибке ?!

Dave Newton 22.08.2018 21:19

как в отправке сообщения от внешнего интерфейса к серверному?

anon 22.08.2018 21:22

Например, показать, что происходит в сети, когда она выходит из строя.

Dave Newton 22.08.2018 21:24

Как мне это сделать?

anon 22.08.2018 21:27

?! Смотришь во вкладку сети и видишь?

Dave Newton 22.08.2018 21:48

Хорошо, я сделал это, и это дает мне статус 200 ОК, который, как я предполагаю, означает, что ошибок нет?

anon 22.08.2018 22:07

Это означает, что статус был 200 (который вы возвращаете, если по какой-то причине возникла ошибка), проверьте данные: что вы анализируете. Мы ничего не видим на вашем конце; мы даже не знаем, где именно возникла ошибка.

Dave Newton 22.08.2018 22:13

Бэкэнд отправляет массив словарей с помощью res.send () У меня нет никаких представлений или html-страницы, включенной в нее, просто отправляя массив

anon 22.08.2018 22:14

Но, предположительно, у вас есть браузер?

Dave Newton 22.08.2018 22:26
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
14
126
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

У меня есть опасения по поводу вашей конечной точки API ... См. Мои комментарии.

Что касается компонента:

fetch является асинхронным - images - это Promise, а не фактический ответ от конечной точки. Вам нужно использовать состояние компонента

class Component extends React.Component {
  componentDidMount () {
    fetch('http://localhost:3000/datastore', {
      mode: "no-cors", // no-cors, cors, *same-origin
      cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached
      credentials: "same-origin", // include, same-origin, *omit
    })
    .then(response => response.json())
    .then(images => this.setState({ images });
  }

  render () {
    const { images } = this.state // use this
    return <div> ... </div>
  }
} 

опять же все это предполагает, что конечная точка возвращает действительный JSON.

Это только лучше упорядочивает мой файл, но не отвечает на мой главный вопрос :( Я спрашиваю, как мне отправить массив из моего бэкэнда в мой интерфейс

anon 22.08.2018 21:04

См. Мои комментарии.

Tyler Sebastian 22.08.2018 21:06

Итак, я изменил свой файл таким образом, и он все еще не отправил массив во внешний интерфейс

anon 22.08.2018 21:11

Ну да, потому что бэкэнд возвращает недопустимый JSON.

Tyler Sebastian 22.08.2018 21:14

тогда почему, когда я скручиваю его, он возвращает JSON?

anon 22.08.2018 21:14

Тайлер Себастьян ответ полностью. Но позвольте мне объяснить это. Всякий раз, когда вы вызываете api с помощью принести, он возвращает Обещать, он в основном асинхронный, поэтому он похож на «вызов api и ожидание его ответа». Так

let images = fetch('http://localhost:3000/datastore', {
    mode: "no-cors", // no-cors, cors, *same-origin
    cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached
    credentials: "same-origin", // include, same-origin, *omit
});

Эта линия изображения является объектом Обещать. Когда вы вызываете .потом на нем. Он ответит вам, когда закончит получение данных из бэкэнда.

let images = fetch('http://localhost:3000/datastore', {  
    mode: "no-cors", // no-cors, cors, *same-origin
    cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached
    credentials: "same-origin", // include, same-origin, *omit
}).then(response => response.json()); //1 This line of code
console.info(images); // 2 and this line of code

Строка номер 6 может быть выполнена перед строкой номер 5. Я предлагаю вам прочитать Обещать, асинхронный код раньше. Вот способ лучше.

fetch('http://localhost:3000/datastore', {  
     mode: "no-cors", // no-cors, cors, *same-origin
     cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached
     credentials: "same-origin", // include, same-origin, *omit
}).then(response => {
   printImages(response); //Note that this is not your data, images array will be deep down in response.response.data
}); 
printResponse = (response) => { 
   console.info(response);
}
Ответ принят как подходящий

Ошибка была на самом деле в серверной части. Я не разрешил перекрестное происхождение

var express = require('express');
var router = express.Router();
let Datastore = require('@google-cloud/datastore')
const datastore = Datastore();
const query = datastore.createQuery('image');

router.get('/', function(req, res, next){
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');

  datastore
  .runQuery(query)
  .then(results => {
    let tasks = results[0];
    console.info('Tasks:');
    tasks.forEach(task => {
      const taskKey = task[datastore.KEY];
      console.info(taskKey.id, task);
    });
    console.info(tasks);
    return res.send(tasks);
  })
  .catch(err => {
    console.error('ERROR:', err);
      return res.status(200).send({
      success: false
    });
  });
});

module.exports = router;

Другие вопросы по теме