为什么异步Google Cloud Function中字典取值得到的ROOT_FOLDER_LOCATION未定义
问题原因及解决方案
导致ROOT_FOLDER_LOCATION未定义的核心原因是salesmanID[salesman]没有匹配到对应值,常见触发场景如下:
- ZOHO CRM传递的
Salesman字段值存在隐藏字符:最常见的是前后多余空格、不可见的换行/制表符,或者大小写与salesmanID的键不匹配,对象的键匹配是严格大小写+全字符匹配,哪怕多一个空格都会匹配失败返回undefined - 字段名匹配错误:
URLSearchParams.get()是大小写敏感的,如果ZOHO传递的字段名不是首字母大写的Salesman,而是全小写salesman、全大写SALESMAN或者其他拼写,会直接返回null,访问salesmanID[null]自然是undefined - 请求体解析逻辑错误:
URLSearchParams仅能解析Content-Type: application/x-www-form-urlencoded格式的请求体,如果ZOHO发送的是JSON格式、multipart格式的请求,解析出来的参数全部无效,salesman取值为null
调试步骤
你可以在let salesman = params.get('Salesman');行后添加以下调试代码,快速定位问题:
// 用JSON.stringify包裹可以直观看到前后多余空格 console.log('Salesman取值:', JSON.stringify(salesman)); // 确认字段是否真的存在于salesmanID的键中 console.log('是否匹配预设键:', Object.keys(salesmanID).includes(salesman)); // 打印全量请求体确认解析是否正确 console.log('原始请求体:', req.body);
修复代码
添加字符串修剪+默认值兜底逻辑,同时兼容不同请求体格式,避免匹配失败导致变量未定义:
const {google} = require('googleapis'); const axios = require('axios').default; const FormData = require('form-data'); const SCOPES = ['https://www.googleapis.com/auth/drive']; // 销售对应客户文件夹ID映射 const salesmanID = {'Jim Schwartz': 'abcdefgXv2', 'Marks Shared Folder': '1M6NUf-abcdefg', 'Samanthas Shared Folder': 'abcdefgVZSMzhoVBU5wJ'}; exports.myFunction = async (req, res) => { try{ let zohoLeadID, firstName, lastName, CLIENT_NAME, salesman; // 兼容不同请求体格式 if (req.is('application/x-www-form-urlencoded')) { const params = new URLSearchParams(req.body); zohoLeadID = params.get('ID'); firstName = params.get('firstName'); lastName = params.get('lastName'); salesman = params.get('Salesman'); } else if (req.is('json')) { zohoLeadID = req.body.ID; firstName = req.body.firstName; lastName = req.body.lastName; salesman = req.body.Salesman; } CLIENT_NAME = `${lastName}, ${firstName}` // 修剪前后空格后匹配,匹配失败默认用Jim Schwartz的文件夹ID兜底 let ROOT_FOLDER_LOCATION = salesmanID[salesman?.trim()] || salesmanID['Jim Schwartz']; let workingRoot = salesmanID['Jim Schwartz']; console.log(salesman); console.log(`workingRoot: ${workingRoot}`); console.log(`${ROOT_FOLDER_LOCATION}`); res.status(200).send('Success'); } catch (err) { console.log(err); res.status(500).send('Failed...'); } };
内容的提问来源于stack exchange,提问作者jim
相关产品推荐
相关产品推荐

