如何从参数中获取参数值?

时间:2018-05-15 01:25:12

标签: javascript node.js actions-on-google

我正在尝试将参数值从Google操作传递到我的履行。 但是,我无法获得参数值。我怎么能只得到" Asda"在论证的newName字段下?我是否必须从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"
  }
}

2 个答案:

答案 0 :(得分:1)

您希望按名称获取Actions SDK argument,然后您可以使用:

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

这将返回参数的rawText

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

conv.arguments.get(这是conv.arguments.parsed.get的快捷方式)将按名称获取参数,返回推断的属性,不包括namestatus,并返回textValue最后的优先事项。

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

最常见的用例是只有一个参数,所以有一个快捷方式可以通过你提到的intent处理程序检索单个参数。

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;
}

答案 1 :(得分:0)

如果你的'newName'是在dialogflow中定义的参数,那么你可以像这样使用conv轻松访问它:

let newN = conv.parameters['newName'];