如何从Google Actions的参数中获取指定字段值?
newName字段值 看起来你在通过Google Actions fulfillment提取参数时遇到了小麻烦,我来帮你梳理一下正确的做法,顺便解答你关于参数命名意义的疑问。
问题根源:你的intent处理函数参数使用有误
你当前的代码里,app.intent('com.example.test.RENAME', (conv, input, arg) => { ... })的参数定义不符合预期:
input对应的是用户的原始查询文本(也就是你看到的"Talk to GoTestApp to rename Asda")arg在这里其实只拿到了第一个参数trigger_query的值"rename Asda",所以arg[1]会取这个字符串的第二个字符"e",这显然不是你想要的。
正确获取newName的方式
因为你已经在Action Package里正确定义了命名参数newName,完全不需要依赖数组索引去提取,有两种更规范的方式:
方式1:通过解构参数直接获取(推荐)
在intent处理函数中,第二个参数是所有命名参数的集合,你可以直接解构出newName:
app.intent('com.example.test.RENAME', (conv, { newName }) => { console.log(newName); // 会输出 "Asda" // 后续逻辑... });
方式2:通过conv.parameters访问
如果需要获取所有参数,也可以通过conv.parameters对象来访问指定参数:
app.intent('com.example.test.RENAME', (conv) => { const newName = conv.parameters.newName; console.log(newName); // 同样输出 "Asda" });
为什么你的原始方法不推荐?
虽然你可以通过conv.inputs[0].arguments[1].rawText拿到值,但这种方式依赖参数在数组中的位置,一旦后续参数顺序调整、新增或删除参数,你的代码就会出错,非常不健壮。
参数命名的意义到底是什么?
参数命名的核心价值就是让你可以直观、稳定地获取指定参数值,不用关心参数在请求中的位置或传输格式。它相当于给每个参数加了一个"标签",你通过标签就能找到对应的值,而不是靠数组索引这种容易变化的标识。
比如你定义了newName参数后,不管Google Actions的请求JSON里参数顺序怎么变,你都能通过params.newName稳定拿到值,代码可读性和可维护性都会大大提升。
验证一下你的配置
从你提供的Action Package配置来看,queryPatterns里的"rename $SchemaOrg_Text:newName"已经正确关联了参数,所以只要用上面的正确方式,就能顺利提取到"Asda"。
内容的提问来源于stack exchange,提问作者holopekochan

