Ниже показан интерфейс с 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;
также похоже, что задачи переходят от массива object к string случайным образом?
Раньше он был у меня как объект, и он по-прежнему давал мне ту же ошибку
перейдите в / curl http://localhost:3000/datastore и вставьте ответ в свой вопрос, пожалуйста.
я получаю следующее, когда скручиваю [{"user": "joeshmo", "description": ["лицо", "выражение лица", "голова", "волосы на лице", "джентльмен", "коллаж", "улыбка») "]," image_address ":" .... ", " translation ": [" 面对 ", " 表情 "," 头 "," 胡子 "," 绅士 "," 大学 ", "微笑"]}, ....]
Почему бы не опубликовать то, что вы получите в ответ, когда получите сообщение об ошибке ?!
как в отправке сообщения от внешнего интерфейса к серверному?
Например, показать, что происходит в сети, когда она выходит из строя.
Как мне это сделать?
?! Смотришь во вкладку сети и видишь?
Хорошо, я сделал это, и это дает мне статус 200 ОК, который, как я предполагаю, означает, что ошибок нет?
Это означает, что статус был 200 (который вы возвращаете, если по какой-то причине возникла ошибка), проверьте данные: что вы анализируете. Мы ничего не видим на вашем конце; мы даже не знаем, где именно возникла ошибка.
Бэкэнд отправляет массив словарей с помощью res.send () У меня нет никаких представлений или html-страницы, включенной в нее, просто отправляя массив
Но, предположительно, у вас есть браузер?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


У меня есть опасения по поводу вашей конечной точки 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.
Это только лучше упорядочивает мой файл, но не отвечает на мой главный вопрос :( Я спрашиваю, как мне отправить массив из моего бэкэнда в мой интерфейс
См. Мои комментарии.
Итак, я изменил свой файл таким образом, и он все еще не отправил массив во внешний интерфейс
Ну да, потому что бэкэнд возвращает недопустимый JSON.
тогда почему, когда я скручиваю его, он возвращает JSON?
Тайлер Себастьян ответ полностью. Но позвольте мне объяснить это. Всякий раз, когда вы вызываете 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;
Как выглядит JSON конечной точки?