У меня работает экспресс-сервер, который обслуживает данные 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"}]
Примечание: я удалил некоторые несоответствующие поля из вывода