ContentService.createTextOutput返回JSON丢失数值变为null问题排查
问题
我尝试通过Google Apps Script的ContentService.createTextOutput返回简单JSON响应,但该方法似乎会剥离数值并替换为null。console.log显示JSON.stringify的输出正确,请问哪里操作出错了?
代码示例
function doPost(e) { let response = {}; console.log(e); switch(e.parameter.action){ case 'request': response = e; return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON); case 'price': response = calculatePrice(e); console.log(JSON.stringify(response)); return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON); case 'default': return ContentService.createTextOutput(JSON.stringify('Error: Action not found')).setMimeType(ContentService.MimeType.JSON); } } function calculatePrice(request){ const { date, num_people, num_guest } = request.parameter; const day = getDay(date); let price = 0; let location = ''; if(day == "Tuesday" || day == "Wednesday" || day == "Friday" || day == "Sunday"){ location = "London"; price = 123; } else { location = "Newcastle"; price = 567; } const people_total = num_people * price; const guest_total = num_guest * 1250; const total_price = people_total + guest_total; const total_deposit = total_price * 0.2; const response = { day, location, total_price, total_deposit, } return response; } function getDay(date){ const dayNames = ["Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; const d = new Date(date); const day = d.getDay(); return dayNames[day]; }
请求与结果
发送POST请求时的参数:action=price&date=01-18-2024&people_total=2&guest_total=1
- 预期返回:
{"day":"Thursday","location":"Newcastle","total_price":2384,"total_deposit":476.8}
- 实际返回:
{ "day": "Thursday", "location": "Newcastle", "total_price": null, "total_deposit": null }
解决方案
问题出在请求参数名不匹配以及字符串未转数值两个核心点:
参数名不匹配
请求里传递的参数是people_total和guest_total,但calculatePrice函数里解构的是num_people和num_guest——这两个变量根本不存在,值为undefined。字符串未转数值
即使参数名匹配,request.parameter中的所有值都是字符串类型,直接参与乘法运算会得到NaN(比如undefined * 123),而JSON序列化时NaN会被自动转为null。
修改后的代码
function doPost(e) { let response = {}; console.log(e); switch(e.parameter.action){ case 'request': response = e; return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON); case 'price': response = calculatePrice(e); console.log(JSON.stringify(response)); return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON); default: // 修正默认分支写法,原case 'default'无法触发 return ContentService.createTextOutput(JSON.stringify('Error: Action not found')).setMimeType(ContentService.MimeType.JSON); } } function calculatePrice(request){ // 修正参数名,并将字符串转为数值类型 const { date, people_total, guest_total } = request.parameter; const num_people = parseInt(people_total, 10); const num_guest = parseInt(guest_total, 10); const day = getDay(date); let price = 0; let location = ''; // 用includes简化多条件判断 if(["Tuesday", "Wednesday", "Friday", "Sunday"].includes(day)){ location = "London"; price = 123; } else { location = "Newcastle"; price = 567; } const people_total_price = num_people * price; const guest_total_price = num_guest * 1250; const total_price = people_total_price + guest_total_price; const total_deposit = total_price * 0.2; const response = { day, location, total_price, total_deposit, } return response; } function getDay(date){ const dayNames = ["Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; const d = new Date(date); const day = d.getDay(); return dayNames[day]; }
额外优化说明
- 修正
switch分支的默认逻辑写法,原case 'default'不符合语法规范,无法触发默认处理 - 用数组
includes方法替代多个||判断,代码更简洁易维护 - 调整变量名避免与请求参数名混淆,提升代码可读性
内容的提问来源于stack exchange,提问作者Matt Nethaway
相关产品推荐
相关产品推荐

