【发布时间】:2017-09-07 19:33:26
【问题描述】:
我正在尝试向我的服务器发送新的推送订阅,但遇到错误“未捕获(承诺中)SyntaxError:JSON 输入的意外结束”,控制台说它在我的索引页面的第 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');
}
}
函数本身(在上述函数之前):
function sendSubscriptionToBackEnd(subscription) {
return fetch('/path/to/app/savesub.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(subscription)
})
.then(function(response) {
if (!response.ok) {
throw new Error('Bad status code from server.');
}
return response.json();
})
.then(function(responseData) {
if (!(responseData.data && responseData.data.success)) {
throw new Error('Bad response from server.');
}
});
}
我尝试在 fetch 调用中用双引号替换单引号,但结果相同。
我知道应该填充 JSON,因为它会在 updateSubscriptionOnServer() 函数中使用 subscriptionJson.textContent = JSON.stringify(subscription); 打印到屏幕上,并且我在 google codelab 的示例服务器中使用该输出来成功接收推送。
编辑:这是作为字符串的 JSON,但我没有看到语法错误:
{"endpoint":"https://fcm.googleapis.com/fcm/send/dLmthm1wZuc:APA91bGULRezL7SzZKywF2wiS50hXNaLqjJxJ869y8wiWLA3Y_1pHqTI458VIhJZkyOsRMO2xBS77erpmKUp-Tg0sMkYHkuUJCI8wEid1jMESeO2ExjNhNC9OS1DQT2j05BaRgckFbCN","keys":{"p256dh":"BBz2c7S5uiKR-SE2fYJrjPaxuAiFiLogxsJbl8S1A_fQrOEH4_LQjp8qocIxOFEicpcf4PHZksAtA8zKJG9pMzs=","auth":"VOHh5P-1ZTupRXTMs4VhlQ=="}}
有什么想法吗??
【问题讨论】:
-
您能否向我们提供服务器的响应?
-
也许问题是,您使用
JSON.stringify()而不是JSON.parse()? -
你的 JSON 是什么样子的,好像是语法错误
-
我同意亚历克斯。忘了你用过
POST。 -
@alexkucksdorf,我收到 JSON.parse() 时不会在服务器端使用它吗?我正在尝试在此处发送代码中的数据。
标签: javascript json web-push