【发布时间】:2019-03-06 21:39:29
【问题描述】:
我有一个正在运行的快速服务器,它提供 JSON 数据。当我的 javascript 代码请求时,它提供来自 3 个文件的数据。在 tha javascript 代码中,我有 3 个函数来执行单独的 http get 方法并将它们与 Promise.all 同步。对于每个解析,我传递解析的 JSON 数据,它会抛出标题中提到的错误。但是,执行会继续,我可以访问 Promise.all 块中的 JSON 数据。我在网上查看,大多数人在服务器响应中缺少大括号等或不正确的内容类型。这些都没有影响我的程序。
错误是 Uncaught SyntaxError: Unexpected end of JSON input 在 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 服务器代码
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 数据要大得多,无法在此处发布。这只是我用来测试的一个样本。样本数据和实际数据均已正确验证,数据本身不存在问题。
我尝试将 content-type 设置为“application/json”,但结果是一样的。 编辑 根据 cmets 中的建议,从文件中读取的数据实际上是字符串。我在发送响应之前解析为 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"}]
注意:我从输出中删除了一些不相关的字段
【问题讨论】:
-
错误是什么? JSON文件是如何生成的?
-
只是要指出,您正在发回 JSON,但将内容类型设置为 text/plain。您不使用 application/json 的任何原因?
-
Uncaught SyntaxError: JSON.parse (
) 处的 JSON 输入意外结束是错误。 @菲利克斯克林 -
您可能正在使用 express...但是 json 不是由 express 生成的...这是您发送的一个简单的静态文件...。如上一条评论中所述,您应该是使用 application/json 顺便说一句......要成为有效的 json,没有 utf8 字符......只有普通的 ASCI 是有效的(\u1234 来编码重音......)
-
几件事情...您确定要从服务器发送 JSON 吗?看起来您只是从文件中提取字符串文本并发送它。我会先 .json() 这个。将内容类型设置为 application/json - 内容类型将为您提供每一次的时间。他们从您的前端删除 JSON.parse - parse 转换一个字符串,但您现在已转换为纯 JSON。
标签: javascript node.js json express es6-promise