我通过Firebase Cloud Functions实现了Google Assistant操作。我了解Cloud Functions可能在调用之间共享实例,并且您可以使用Global范围进行繁重的准备工作。我的函数实例化了一个全局类,该类已序列化了一些JSON并处理了我函数中的返回数据和其他任务。我在此类中有一些变量,这些变量是在调用函数时设置的,并且要小心确保已使用当前对话特有的conv.data
会话数据对象来设置所有变量。希望是,尽管类实例可能存在于不同的调用之间,并且可能由不同的用户存在,但仍将在本地范围内进行上下文化,并且我不会看到任何变量被其他会话覆盖。
哪个带给我这个问题,那就是我该如何测试?我已经尝试在浏览器控制台中进行测试的同时,使用Google Assistant应用在我的移动设备上进行测试。我目睹了两个会话合并在一起,这是一个可怕的混乱,但是我不确定这是全局范围,还是不确定我是否正在使用相同的用户帐户测试两个会话。
有人能启发我使用同一个用户帐户来执行两个相同的操作吗?似乎conv.data
对象混合了我正在运行的两个不同会话,这表明它在两个会话中都使用了相同的会话令牌。
另一个问题是,您认为使用全局类来存储跨调用的状态是否会成为不同用户的问题?文档确实声明一次只能调用一次该函数。因此,不应有任何竞争条件类型的场景。
Dialogflow 应该将conv.data
中的数据隔离到单个会话,甚至是来自同一用户的会话。使用Dialogflow时,此数据存储在特定于会话的Context中。
您可以通过打开StackDriver登录来验证这一点,这将使您检查Dialogflow在实现中使用的确切请求和响应,其中将包括用于跟踪的会话ID。 (并且,如果您认为两者混合在一起,则发布请求和响应详细信息将有助于弄清发生了什么。)
很粗略地说,这听起来像是您在全局中混入了一些东西,或者可能是在一个会话中设置的东西没有被另一个会话清除或覆盖。再次-查看确切的请求和响应应该可以帮助您(和/或我们)弄清楚这一点。
我的态度是,诸如此类的全局变量应被视为只读。如果您希望某个环境对象仅包含本次会议的相关信息,那么我将把它与哲学设计区分开来。
当然,我不会使用该全局状态来存储之间会话的信息。虽然仅会调用一个函数,但我不确定该函数如何与Promises配合使用-一旦启动任何异步操作,您将需要使用Promises。它还冒着后续调用可能在不同实例上的风险。
简而言之,我的方法(在多声方面我相当坚定):
conv.data
应该如此。request
,conv
或您创建的其他某些特定于请求的对象访问。