首页 > 解决方案 > 如何从参数中获取参数值?

问题描述

我正在尝试将参数值从谷歌操作传递给我的履行。但是,我无法仅获取参数值。我应该如何才能newName从论点中仅获得“Asda”?我必须从conv(如conv.inputs.arguments[1].rawText)中提取它吗?如果是这样,那么为参数命名的目的是什么?

从 Google 操作请求 JSON:

{
  "user": {
    "userId": "ABwppHEAPgcgb2yFUFURYFEJGg4VdAVcL9UKO9cS7a7rVfAMr9ht67LzgrmMseTvb5mmJjbjj7UV",
    "locale": "en-US",
    "lastSeen": "2018-05-15T01:08:55Z",
    "userStorage": "{\"data\":{}}"
  },
  "conversation": {
    "conversationId": "1526346570079",
    "type": "NEW"
  },
  "inputs": [
    {
      "intent": "com.example.test.RENAME",
      "rawInputs": [
        {
          "inputType": "KEYBOARD",
          "query": "Talk to GoTestApp to rename Asda"
        }
      ],
      "arguments": [
        {
          "name": "trigger_query",
          "rawText": "rename Asda",
          "textValue": "rename Asda"
        },
        {
          "name": "newName",
          "rawText": "Asda",
          "textValue": "Asda"
        }
      ]
    }
  ],
  "surface": {
    "capabilities": [
      {
        "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
      },
      {
        "name": "actions.capability.SCREEN_OUTPUT"
      },
      {
        "name": "actions.capability.AUDIO_OUTPUT"
      },
      {
        "name": "actions.capability.WEB_BROWSER"
      }
    ]
  },
  "isInSandbox": true,
  "availableSurfaces": [
    {
      "capabilities": [
        {
          "name": "actions.capability.SCREEN_OUTPUT"
        },
        {
          "name": "actions.capability.AUDIO_OUTPUT"
        }
      ]
    }
  ]
}

我的履行方面的代码:

app.intent('com.example.test.RENAME', (conv, input, arg) => {
  console.log(input); //print Talk to GoTestApp to rename Asda
  console.log(arg); //only print "rename Asda"
  console.log(arg[1]) //only print "e"
}

行动包行动:

  "name": "RENAME",
  "intent": {
    "name": "com.example.test.RENAME",
    "parameters": [{
      "name": "newName",
      "type": "SchemaOrg_Text"
    }],
    "trigger": {
      "queryPatterns": [
        "rename $SchemaOrg_Text:newName"
      ]
    }
  },
  "fulfillment": {
    "conversationName": "example"
  }
}

标签: javascriptnode.jsactions-on-google

解决方案


看起来您想按名称获取Actions SDK 参数,然后您可以使用:

const newName = conv.arguments.get('newName')

这将返回rawText参数的。

参数检索非常复杂,因此实际上有 4 种方法可以按名称或按列表检索参数。

conv.arguments.get(它是 的快捷方式conv.arguments.parsed.get)将按名称获取参数,返回推断的属性,排除namestatustextValue以最后优先级返回。

conv.arguments.status.get可用于status按名称获取参数。

最常见的用例是只有一个参数时,因此有一个快捷方式可以通过您提到的意图处理程序检索单个参数。

app.intent('intent.name', (conv, input, arg, status) => {
  console.log(arg); // print the parsed single argument like `rawText` if exists
  console.log(status) // print the single argument status if exists
}

要在不进行任何推断解析的情况下按名称获取原始参数,您可以使用conv.arguments.raw.get. 然后你可以手动提取出类似rawTexttextValue你自己的属性。

对于这些参数中的每一个 getter,都有一种相应的方法可以使用数组按顺序检索:conv.arguments.parsed.listconv.arguments.status.listconv.arguments.raw.list

conv.arguments对于原始值也是可迭代的,所以如果你想遍历原始参数,只需执行以下操作:

for (const arg of conv.arguments) {
  const value = arg.rawText;
}

推荐阅读