Javascript 未捕获(承诺中)语法错误:JSON输入意外结束

Javascript 未捕获(承诺中)语法错误:JSON输入意外结束,javascript,json,web-push,Javascript,Json,Web Push,我试图向我的服务器发送一个新的推送订阅,但是遇到了一个错误“Uncaught(in promise)SyntaxError:Unexpected end of JSON input”,控制台说它在我的索引页的第1行,显然不是这样 我怀疑出现问题的函数是sendSubscriptionToBackEnd(subscription),该函数在下面调用: function updateSubscriptionOnServer(subscription) { const subscriptionJs

我试图向我的服务器发送一个新的推送订阅,但是遇到了一个错误“Uncaught(in promise)SyntaxError:Unexpected end of JSON input”,控制台说它在我的索引页的第1行,显然不是这样

我怀疑出现问题的函数是
sendSubscriptionToBackEnd(subscription)
,该函数在下面调用:

function updateSubscriptionOnServer(subscription) {
  const subscriptionJson = document.querySelector('.js-subscription-json');
  const subscriptionDetails = document.querySelector('.js-subscription-details');

  if (subscription) {
    subscriptionJson.textContent = JSON.stringify(subscription);
    sendSubscriptionToBackEnd(subscription);
    subscriptionDetails.classList.remove('is-invisible');
  } else {
    subscriptionDetails.classList.add('is-invisible');
  }
}
函数本身(位于上述函数之前):

我曾尝试在fetch调用中用双引号替换单引号,但结果相同

我知道应该填充JSON,因为它在
updateSubscriptionOnServer()
函数中以
subscriptionJson.textContent=JSON.stringify(subscription)打印到屏幕上,我在GoogleCodeLab的示例服务器中使用该输出成功接收推送

编辑:以下是JSON字符串,但我没有看到语法错误:

{"endpoint":"https://fcm.googleapis.com/fcm/send/dLmthm1wZuc:APA91bGULRezL7SzZKywF2wiS50hXNaLqjJxJ869y8wiWLA3Y_1pHqTI458VIhJZkyOsRMO2xBS77erpmKUp-Tg0sMkYHkuUJCI8wEid1jMESeO2ExjNhNC9OS1DQT2j05BaRgckFbCN","keys":{"p256dh":"BBz2c7S5uiKR-SE2fYJrjPaxuAiFiLogxsJbl8S1A_fQrOEH4_LQjp8qocIxOFEicpcf4PHZksAtA8zKJG9pMzs=","auth":"VOHh5P-1ZTupRXTMs4VhlQ=="}}

任何想法???

这可能是端点未在响应头中传递适当参数的问题

在Chrome的控制台中,在“网络”选项卡内,检查端点发送的标题,它应该包含以下内容:

请API开发人员在标题中包含以下内容:

"Access-Control-Allow-Origin" : "*", 
"Access-Control-Allow-Credentials" : true 

等一下再找。我收到这个错误不是因为我的头,而是因为我没有在稍后将响应主体递归地附加到JSON.parse的字符串中

根据(我已经从他们的例子中拿出了一些不直接相关的部分):

reader.read().then(函数processText({done,value}){
如果(完成){
控制台日志(“流完成”);
返回;
}
结果+=块;
返回reader.read().then(processText);

});其中一个缺陷是返回的数据不是JSON,而只是纯文本有效负载,不管设置了什么标题。也就是说,通过类似于

res.send({a: "b"});
而不是

res.json({a: "b"});

将返回此令人困惑的错误。不容易在网络活动中检测,因为它看起来非常合法。

这可能是因为您没有从服务器发送任何JSON 或 这可能是因为您发送的JSON无效

您的代码可能看起来像
res.end()

当我使用Express.js运行服务器并使用浏览器时,这种情况也发生在我身上。就我而言,这是CORs的问题。我做了以下操作,解决了我的问题: (因为这是一个Express框架,所以我使用app.get)

-在服务器端:

 res.set({
        "Content-Type": "application/json",
        "Access-Control-Allow-Origin": "*",
    });
-在客户端,我使用Fetch获取数据,但禁用了CORS选项

// mode: "no-cors" //disabled this in Fetch

这解决了我在使用Express获取数据时遇到的问题

你能给我们提供服务器的响应吗?也许问题是,你使用了
JSON.stringify()
而不是
JSON.parse()
?你的JSON看起来像什么,看起来像是语法错误我同意alex的说法。忘记您使用了
POST
@alexkucksdorf,当我收到它时,服务器端不会使用JSON.parse()吗?我正试图在这里发送代码中的数据。
// mode: "no-cors" //disabled this in Fetch