为什么具有空值的对象键对不再从服务器传递到客户端?

Why is object key pair with null value not passed from server to client anymore?

我有一个 Google 应用程序脚本 Web 应用程序,我在其中使用 google.script.run.withSuccessHandler。服务器端函数 returns 一个所有值为空的对象。 MaterializeCSS autocomplete 需要空值

我的客户今天报告 GAS 网络停止工作。之前工作是 10000000%。我发现原因是 null 作为一个值。

工作示例应用程序在这里

https://script.google.com/macros/s/AKfycbzbg4YLndZ0zORBzgDc3ETLUdJeToUS1nKjORUa5fNxQt9syXmLlX1gDHzgS4w8iCBM9A/exec

https://script.google.com/d/1Uba73PIetb9fmrO44nwsmAd_epZTHy4lwz5bG3bURK3jqpd161JT0pf5/edit?usp=sharing

HTML代码

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    Test
<script type="text/javascript">
 console.log("test")

document.addEventListener("DOMContentLoaded", function(event) { 
    google.script.run.withSuccessHandler(afterDataReceived)
                    .returnObject()
    });

function afterDataReceived(receivedData){
  console.log(receivedData)
}
     </script>
     </body>
</html>

GS 代码

function doGet(e) {

  var htmlTemplate = HtmlService.createTemplateFromFile("index").evaluate()

  return htmlTemplate
}

function returnObject(){

  var object = {}

  object.a = "123"
  object.b = null
  object.c = 123

console.log(object)  
  return object
}

有人遇到同样的错误吗?如何解决这个问题?

问题:

如果 null 是对象中 key 的值,当对象从服务器传递到客户端时,键值对丢失,尽管 null is a legal parameter.I可以确认问题。

解决方案:

问题已报告 here。给这个issue加个​​star,如果还有人有同样的issue。

作为非法参数的典型解决方法,在服务器端使用 JSON.stringify(),将 string 传递给客户端,并在客户端传递 JSON.parse() 以获取对象内部的空值。

服务器:

function returnObject(){
  return JSON.stringify({a:1,b:null,c:3});
}

客户:

document.addEventListener("DOMContentLoaded",    
 function(event) { 
  google.script.run
    .withSuccessHandler(afterDataReceived)
    .returnObject()
});

function afterDataReceived(receivedData){
  console.log(JSON.parse(receivedData));
}