Невозможно определить синтаксическую ошибку при получении данных JSON с Express Server - PullRequest
0 голосов
/ 07 марта 2019

У меня работает экспресс-сервер, который обслуживает данные JSON. Он запрашивает данные из 3 файлов по запросу из моего кода JavaScript. В коде javascript у меня есть 3 функции для выполнения отдельных методов http get и я синхронизировал их с Promise.all. Для каждого разрешения я передаю проанализированные данные JSON и выдает ошибку, указанную в заголовке. Однако выполнение продолжается, и я могу получить доступ к данным JSON в блоке Promise.all. Я посмотрел онлайн, и у большинства людей отсутствовали фигурные скобки и т. Д. Или неправильный тип содержимого в ответе сервера. Ничто из этого не повлияло на мою программу вообще.

Ошибка Uncaught SyntaxError: Неожиданный конец ввода JSON в JSON.parse ()

Любая помощь будет принята с благодарностью. Фрагменты исходного кода приведены ниже: -

Блок обещаний Javascript

function getposts() {
  return new Promise(function(resolve, reject) {
    var httpposts = new XMLHttpRequest();
    httpposts.open("GET", "http://localhost:3000/users");
    httpposts.send();
    httpposts.onreadystatechange=(e)=>{
      if(httpposts.readyState==4 & httpposts.status==200){
        resolve(JSON.parse(httpposts.responseText));
      }
    }
  });
}

function getcomments() {
  return new Promise(function(resolve, reject) {
    var httpcomments = new XMLHttpRequest();
    httpcomments.open("GET", "http://localhost:3000/comments");
    httpcomments.send();
    httpcomments.onreadystatechange=(e)=>{
      //console.log(httpcomments);
      if(httpcomments.readyState==4 & httpcomments.status==200){
        resolve(JSON.parse(httpcomments.responseText));
      }
    }
  });
}

function getuser() {
  return new Promise(function(resolve, reject) {
    var httpuser = new XMLHttpRequest();
    httpuser.open("GET", "http://localhost:3000/posts");
    httpuser.send();
    httpuser.onreadystatechange=(e)=>{
      if(httpuser.readyState==4 & httpuser.status==200){
        resolve(JSON.parse(httpuser.responseText));
      }
    }
  });
}

Promise.all([getposts(), getcomments(), getuser()]).then(function(data) {
  console.log(data);
  //alert("promise");
  if(window.localStorage.length == 0){
  localStorage.setItem("users", data[2]);
  localStorage.setItem("comments", data[1]);
  localStorage.setItem("posts", data[0]);
}
})

Код Экспресс-сервера

const fs = require("fs");
const express = require("express");
const app = express();
const cors = require("cors");
app.use(cors());

app.get("/users", (req,resp) =>{
fs.readFile("users.json", "utf-8", (err,data)=>{
if(!err) {
resp.setHeader("Content-Type","text/plain");
resp.status(200).send(data);
console.log("users json data served");
}
})
});

app.get("/comments", (req,resp) =>{
fs.readFile("comments.json", "utf-8", (err,data)=>{
if(!err) {
resp.setHeader("Content-Type","text/plain");
resp.status(200).send(data);
console.log("comments json data served");
}
})
});

app.get("/posts", (req,resp) =>{
fs.readFile("posts.json", "utf-8", (err,data)=>{
if(!err) {
resp.setHeader("Content-Type","text/plain");
resp.status(200).send(data);
console.log("posts json data served");
}
})
});

app.use((req,resp)=>{
resp.send("Invalid request.Try <br /> localhost:3000/users<br />  localhost:3000/comments<br /> localhost:3000/posts");
});

app.listen(3000, () => {
console.log("server running at 3000");
});

Образец данных JSON [ { «Пользователь»: «Имя пользователя», «Орг»: «привет» } ] Фактические данные JSON гораздо больше и нецелесообразно размещать здесь. Это просто пример, который я использовал для тестирования. Образцы и фактические данные проверены надлежащим образом, и с самими данными это не проблема.

Я пытался установить тип контента в "application / json", но результат тот же. Редактировать Согласно предложениям в комментариях, данные, прочитанные из файла, были фактически строковыми. Я проанализировал JSON перед отправкой в ​​ответ и удалил JSON.parse из внешнего интерфейса, но в этом случае ошибка удаляется, но тогда data [] просто имеет 3 пустых строки. curl -i http://localhost:3000 говорит: -

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 35
ETag: W/"23-kjXHKbaflCAUIVzhPs6BcPM2sOg"
[{"user":"username","org":"hello"}]

Примечание: я удалил некоторые несоответствующие поля из вывода

1 Ответ

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

Снятие чека на httpresponse.readyState == 4 - вот что привело к возникновению проблемы.

После отмены комментирования этой части в моем коде она работает отлично.Оглядываясь назад, я должен был опубликовать код в точности так, как он был в моем редакторе, вместо того, чтобы редактировать его в SO, чтобы избежать вопросов.Обещания были решены до того, как ответы были завершены и готовы, поэтому данные JSON неожиданно завершились.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...