我正在阅读有关Google Assistant的NodeJS教程/ Google https://codelabs.developers.google.com/codelabs/actions-1/#5上的操作,其代码如下:
app.intent('Location', (conv, {geo-city}) => {
const luckyNumber = geo-city.length;
// Respond with the user's lucky number and end the conversation.
conv.close('Your lucky number is ' + luckyNumber);
});
Dialogflow和我的IDE中的linter都不满意{geo-city}
,但是我找不到解决它的方法。我试过引号,反引号等,但没有任何乐趣。我无法更改变量名称,因为它是Google AI系统实体(https://cloud.google.com/dialogflow-enterprise/docs/reference/system-entities)。
请问正确的处理方法是什么?
答案 0 :(得分:2)
这是对象破坏语法。当您这样做时:
const func = ({ foo }) => console.log('foo is', foo);
...您正在告诉JavaScript:func
将以一个对象作为参数,但是我只对名为foo
的对象的属性感兴趣,因此请输入变量foo
中foo
属性的值,忽略其余部分。
但是,尽管geo-city
在JavaScript中是有效的属性名称,但它不是有效的变量名称(否则,将无法判断它是否是变量,或者是否要减去{{1 }}来自city
)。解决此问题的一种方法是,仅将对象作为参数:
geo
...或者应用于您的代码:
const func = (obj) => console.log('foo is', obj.foo);
但是解构很好,我们还有另一种方法可以使它起作用。分解对象时,可以为变量提供另一个名称:
app.intent('Location', (conv, obj) => {
const luckyNumber = obj['geo-city'].length;
// ...
});
这甚至适用于const func = ({ foo: valueOfFoo }) => console.log('foo is', valueOfFoo);
之类的属性,但是您必须将其用引号引起来,例如:
geo-city
答案 1 :(得分:2)
您可以在Dialogflow参数列表中更改名称。尽管它基于实体类型使用默认值,但您可以将其更改为所需的任何值。
例如,给定此训练短语,在训练短语中选择城市名称,为其指定类型@sys.geo-city
,并为其指定默认名称geo-city
您可以单击参数名称,对其进行编辑,然后将其更改为“ city”。
然后,您的代码仅使用city
作为参数名称。
app.intent('Location', (conv, {city}) => {
const luckyNumber = city.length;
// Respond with the user's lucky number and end the conversation.
conv.close('Your lucky number is ' + luckyNumber);
});
如果您确实希望将其命名为“ geo-city”,则仍可以仅将其用作参数名称。该函数的第二个参数只是一个在Dialogflow参数名称上键入的对象,并且他们使用一些JavaScript语法糖来对其进行解构。但是您不必。您可以使用类似
的代码app.intent('Location', (conv, params) => {
const luckyNumber = params['geo-city'].length;
// Respond with the user's lucky number and end the conversation.
conv.close('Your lucky number is ' + luckyNumber);
});