我有一个运行快速服务器,该服务器提供JSON数据。从我的JavaScript代码请求时,它可以提供3个文件中的数据。在javascript代码中,我具有3个函数来执行单独的http get方法并将它们与Promise.all同步。对于每个解析,我都传递解析后的JSON数据,并抛出标题中提到的错误。但是,执行的确继续,并且我能够访问Promise.all块中的JSON数据。我在网上查看时,大多数人在服务器响应中都缺少括号等内容或错误的内容类型。这些都不影响我的程序。
错误是未捕获的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]);
}
})
Express Server代码
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数据示例 [ { “ user”:“用户名”, “ org”:“你好” } ] 实际的JSON数据要大得多,因此无法在此处发布。这只是我用来测试的样本。样本数据和实际数据均已正确验证,这与数据本身无关。
我尝试将content-type设置为“ 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"}]
注意:我从输出中删除了一些不相关的字段
答案 0 :(得分:0)
删除对 httpresponse.readyState == 4 的检查是导致此问题的原因。
在我的代码中取消注释该部分时,它可以完美运行。事后看来,我应该完全按照编辑器中的代码发布代码,而不是在SO上进行编辑以避免出现问题。在响应完成并准备好之前,诺言就已经解决了,因此JSON数据输入意外结束。