Botframework-solutions: 打字稿:在解析请求中覆盖本地时间戳

创建于 2020-01-21  ·  4评论  ·  资料来源: microsoft/botframework-solutions

什么项目受到影响?

技能和VA

这是什么语言?

打字稿

发生什么了?

当我们从不同的时区发送消息时,localTimezone 每次都会被本地服务器时区覆盖,我们会丢失用户的时区。

重现此问题的步骤是什么?

尝试从时区中的客户端发送消息并从客户端的不同时区接收消息。

你期待发生什么?

至少在上下文中具有用户时区

你能分享任何日志、错误输出等吗?

这发生在BotFrameworkAdapter ,在processActivity方法和parseRequest函数中。

if (typeof activity.localTimestamp === 'string') { activity.localTimestamp = new Date(activity.localTimestamp); }

任何屏幕截图或其他上下文?

Bot Services Bug customer-replied-to customer-reported

最有用的评论

嗨@tommyJimmy87! 感谢您报告问题!

我们重现了该问题,并希望与您一起验证我们为实现此目的而遵循的重现步骤。 此外,我们将继续使用 C# 机器人重现问题,以便比较实现并找到解决问题的后续步骤。

重现步骤

使用 TypeScript虚拟助手示例

  1. 转到虚拟助手的文件夹
  2. 使用npm install安装依赖项
  3. npm run build编译解决方案
  4. 使用以下命令部署虚拟助手:
pwsh.exe -File deployment\scripts\deploy.ps1 -name "<BOT_NAME>" -location "<LOCATION>" -appId "<APP_ID>" -appPassword "<APP_PASSWORD>" -luisAuthoringKey "<LUIS_AUTHORING_KEY>" -luisAuthoringRegion "<LUIS_AUTHORING_REGION>"
  1. 打开Bot Framework Emulator ,配置连接本地运行的Virtual Assistant
    image

  2. Botbuilder库中的botFrameworkAdapter.ts的第 1004 行设置断点
    image

  3. System Time zone更改为不同的(例如 UTC+03:00 Minsk)
    image

  4. 调试虚拟助手

  5. 使用模拟器开始与虚拟助手聊天
  6. 执行将在断点处停止。 activity.localTimestamp将显示具有先前本地服务器时区的日期时间
    image

  7. 分配后, activity.localTimestamp的新日期时间将具有新用户的时区
    image

谢谢:放松:

所有4条评论

嗨@tommyJimmy87! 感谢您报告问题!

我们重现了该问题,并希望与您一起验证我们为实现此目的而遵循的重现步骤。 此外,我们将继续使用 C# 机器人重现问题,以便比较实现并找到解决问题的后续步骤。

重现步骤

使用 TypeScript虚拟助手示例

  1. 转到虚拟助手的文件夹
  2. 使用npm install安装依赖项
  3. npm run build编译解决方案
  4. 使用以下命令部署虚拟助手:
pwsh.exe -File deployment\scripts\deploy.ps1 -name "<BOT_NAME>" -location "<LOCATION>" -appId "<APP_ID>" -appPassword "<APP_PASSWORD>" -luisAuthoringKey "<LUIS_AUTHORING_KEY>" -luisAuthoringRegion "<LUIS_AUTHORING_REGION>"
  1. 打开Bot Framework Emulator ,配置连接本地运行的Virtual Assistant
    image

  2. Botbuilder库中的botFrameworkAdapter.ts的第 1004 行设置断点
    image

  3. System Time zone更改为不同的(例如 UTC+03:00 Minsk)
    image

  4. 调试虚拟助手

  5. 使用模拟器开始与虚拟助手聊天
  6. 执行将在断点处停止。 activity.localTimestamp将显示具有先前本地服务器时区的日期时间
    image

  7. 分配后, activity.localTimestamp的新日期时间将具有新用户的时区
    image

谢谢:放松:

@VictorGrycuk ! 首先感谢您的快速答复!

我不知道我是否非常理解这些步骤,但我会尝试用我们为重现问题所做的所有步骤更好地解释自己:

  1. 第一个假设是我们在本地部署了虚拟助手。

  2. 第二个假设是我们想用 2 台不同的笔记本电脑执行测试,其中第一台笔记本电脑是客户端(对我们来说是 Teams),第二台笔记本电脑是我们运行 VA 的服务器。

  3. 第三个假设是我们在 2 台笔记本电脑上设置了 2 个不同的时区,假设第一个(客户端)将具有GMT+0300而服务器将具有GMT+0100

  4. 然后在我们完成所有设置后,我们尝试从客户端通过 Teams 向 VA 发送请求。

  5. 一旦我们收到请求,我们就会在正文中将用户的正确时区作为参数:

Screen Shot 2020-01-23 at 14 30 02

Screen Shot 2020-01-23 at 14 29 49

  1. 在解析请求中,我们得到了正确的 Client Timezone :

Screen Shot 2020-01-23 at 14 34 12

  1. 但是在分配变量(基本上是 new Date(activity.localTimestamp) )之后,我们有了服务器时区:

Screen Shot 2020-01-23 at 14 36 52

嘿@tommyJimmy87! 谢谢你的详细步骤! 我们将审查这种情况,稍后我们会回复您😊。

嗨@tommyJimmy87!

我们得出的结论是,这是由于 JavaScript 处理Date对象的方式受到限制。

但是,我们想让您知道我们在 BotBuilder-JS 存储库中打开了有关此问题的问题 #1612 。 您可以在那里跟踪此问题的进度,因此也请检查那里。

至于我们发现的问题,当将任何日期转换为Date对象时,JS 将其转换为 UTC,这实际上剥离了原始时区。 JavaScript 唯一可以处理的时区是运行 JS 的系统的时区。
您可以查看日期文档以获取信息。

我们会让您知道任何进展:relaxed:

此页面是否有帮助?
0 / 5 - 0 等级