Node.js调用GA4报update_mask.paths错误如何修复
问题现象
在Node.js环境下使用4.0.0版本的Google Analytics Admin Client(GA4)调用updateDataRetentionSettings接口更新数据保留配置时,抛出如下3号INVALID_ARGUMENT错误:
Error: 3 INVALID_ARGUMENT: One or more values in the field 'update_mask.paths_list' was invalid, but all values must be valid.eventDataRetention, resetUserDataOnNewActivity at Object.callErrorFromStatus (C:\my_working_path\GA4_manager\node_modules\@grpc\grpc-js\build\src\call.js:31:26) at Object.onReceiveStatus (C:\my_working_path\GA4_manager\node_modules\@grpc\grpc-js\build\src\client.js:189:52) at Object.onReceiveStatus (C:\my_working_path\GA4_manager\node_modules\@grpc\grpc-js\build\src\client-interceptors.js:365:141) at Object.onReceiveStatus (C:\my_working_path\GA4_manager\node_modules\@grpc\grpc-js\build\src\client-interceptors.js:328:181) at C:\my_working_path\GA4_manager\node_modules\@grpc\grpc-js\build\src\call-stream.js:187:78 at processTicksAndRejections (node:internal/process/task_queues:78:11) { code: 3, details: "One or more values in the field 'update_mask.paths_list' was invalid, but all values must be valid.eventDataRetention, resetUserDataOnNewActivity", metadata: Metadata { internalRepr: Map(1) { 'grpc-server-stats-bin' => [Array] }, options: {} }, note: 'Exception occurred in retry method that was not classified as transient' }
使用的业务代码如下,尝试将name字段加入updateMask路径列表后仍然返回相同错误:
const analyticsAdmin = require("@google-analytics/admin"); class Main { constructor() { this.analyticsAdminClient = new analyticsAdmin.AnalyticsAdminServiceClient({ keyFilename: "./mykeyfile.json", }); } async updateDataRetentionSettings() { const name = "properties/*********/dataRetentionSettings"; const request = { dataRetentionSettings: { name: name, eventDataRetention: "FOURTEEN_MONTHS", resetUserDataOnNewActivity: true, }, updateMask: { paths: ["eventDataRetention", "resetUserDataOnNewActivity"], }, }; let retention = {}; try { retention = await this.analyticsAdminClient.updateDataRetentionSettings(request); } catch (e) { console.log(e); process.exit(1); } return retention[0]; } } const client = new Main(); client.updateDataRetentionSettings();
错误原因
GA4 Admin API接口原生字段采用蛇形(下划线分隔)命名规则。Node.js客户端虽然会自动转换请求实体里的驼峰/蛇形字段名,但updateMask.paths列表内的字符串值不会被自动转换,必须严格传入后端可识别的蛇形格式字段名。传入的驼峰格式eventDataRetention、resetUserDataOnNewActivity不属于后端认可的有效字段,因此触发参数非法错误。
修复方案
只需要将updateMask.paths内的字段名替换为API定义的蛇形格式即可,不需要把name字段加入路径列表(name是资源定位标识,不属于可更新的配置字段)。修正后的可运行代码如下:
const analyticsAdmin = require("@google-analytics/admin"); class Main { constructor() { this.analyticsAdminClient = new analyticsAdmin.AnalyticsAdminServiceClient({ keyFilename: "./mykeyfile.json", }); } async updateDataRetentionSettings() { const name = "properties/*********/dataRetentionSettings"; const request = { dataRetentionSettings: { name: name, eventDataRetention: "FOURTEEN_MONTHS", resetUserDataOnNewActivity: true, }, updateMask: { // 注意:paths必须传蛇形命名的原生字段,不能用驼峰格式 paths: ["event_data_retention", "reset_user_data_on_new_activity"], }, }; let retention = {}; try { retention = await this.analyticsAdminClient.updateDataRetentionSettings(request); } catch (e) { console.log(e); process.exit(1); } return retention[0]; } } const client = new Main(); client.updateDataRetentionSettings();
- 后续更新其他GA4资源如果遇到同类
update_mask非法错误,优先检查传入的路径名是否和API定义的蛇形字段名完全一致即可。
内容的提问来源于stack exchange,提问作者kazuma
相关产品推荐
相关产品推荐

