javascript - 未捕获( promise )SyntaxError : Unexpected end of JSON input

标签 javascript json web-push

我正在尝试向我的服务器发送新的推送订阅,但遇到错误“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');
  }
}

函数本身(在上述函数之前):

 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,因为它使用 subscriptionJson.textContent = JSON.stringify(subscription);updateSubscriptionOnServer() 函数中打印到屏幕上,我在 google codelab 的示例服务器中使用该输出成功接收了推送。

编辑:这是字符串形式的 JSON,但我没有看到语法错误:

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

有什么想法吗??

最佳答案

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

在 Chrome 的控制台中,在“网络”选项卡内,检查端点发送的 header ,它应该包含以下内容: Example of proper response to allow requests from localhost and cross domains requests

要求 API 开发人员将其包含在 header 中:

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

关于javascript - 未捕获( promise )SyntaxError : Unexpected end of JSON input,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43362431/

相关文章:

javascript - 为什么这不起作用?

javascript - 如何在浏览器中配置 prettier 以缩进 html

C# 为值排序 JSON

javascript - Chrome 浏览器推送通知包含数据?

JavaScript。 react 。还原。异步。在渲染 DOM 之前循环没有完成

javascript - 如何让所有元素都在另一个元素的右边

jquery - 将 jQuery 中的 JSON 解析为 div 标签

javascript - 过滤json数据然后使用d3.nest

javascript - 安全地存储 Web 推送通知的订阅 JS/Node.js

javascript - 在Rails中生成VAPID公钥并将其传递给Javascript