Хранилище больших двоичных объектов MS Bot не может найти текущего пользователя

#botframework #azure-blob-storage

#botframework #azure-blob-storage

Вопрос:

Мы пытаемся сохранить информацию о пользователе в хранилище больших двоичных объектов. Мы можем записать, проверить, что файл существует нормально, но когда мы пытаемся получить к нему доступ в диалоговом окне от context пользователя, он не найден.

В нашей начальной конечной точке подключения проверьте, существует ли пользователь, если нет, мы создаем его:

 await storage.write({
  [`directline/users/${userId}`]: {
    [USER_STATE_PROPERTY]: {
      customData: {},
    }
  }
});
  

Запись находится в хранилище больших двоичных объектов. Хранилище больших двоичных объектов, которое у нас есть, выглядит так:

 import {
  AutoSaveStateMiddleware,
  BotFrameworkAdapter,
  UserState,
  ConversationState
 } from 'botbuilder';
import { log } from './logger';
import { BlobStorage } from 'botbuilder-azure';
import Bot from '../bot';

const storage = new BlobStorage({
  containerName: BLOB_CONTAINER_NAME,
  storageAccountOrConnectionString: BLOB_CONNECTION_STRING
});

const userState = new UserState(storage);
const conversationState = new ConversationState(storage);
const botInstance = new Bot(conversationState, userState);

const adapter = new BotFrameworkAdapter({
  appId: APP_ID,
  appPassword: APP_PASSWORD,
});

adapter.use(new AutoSaveStateMiddleware(conversationState, userState));

...
  

Однако, когда начинается диалог, мы не можем найти текущего пользователя:

 class Bot {
  private conversationState;
  private userState;
  private dialogState;
  private dialogs;
  private userProfile;

  constructor(conversationState: ConversationState, userState) {
    this.conversationState = conversationState;
    this.userState = userState;
    this.dialogState = this.conversationState.createProperty(DIALOG_STATE_PROPERTY);
    this.userProfile = this.userState.createProperty(USER_STATE_PROPERTY);
    this.dialogs = new DialogSet(this.dialogState);
  }

  public async onTurn(turnContext) {
    const { type, membersAdded, recipient } = turnContext.activity;

    if (type === ActivityTypes.Message || type === ActivityTypes.Event) {
      const user = await this.userProfile.get(turnContext, {});
      // user is always {}
    }
  }
  

Комментарии:

1. Используете ли вы метод SaveChanges для проверки изменений свойства в кэше состояний, а затем записи этих изменений в хранилище?

Ответ №1:

Так плохо. Ошибка отсутствовал конец / , который MS добавляет к каждому идентификатору