Как я могу сохранить имя пользователя из события обратного канала в переменной?

Я создал чат-бота SharePoint с использованием v4 Bot Framework и NodeJS, и у меня возникла небольшая проблема, когда я пытаюсь сохранить имя пользователя события, которое отправляется боту от клиента с помощью задний канал.

Бот выводит имя пользователя, как ожидалось, но, похоже, оно не сохраняется в боте, когда я пытаюсь вызвать его через переменную. Когда я смотрю журнал консоли бота, все, что отображается, - это идентификатор, а не информация о событии.

Цель этого состоит в том, чтобы сохранить имя пользователя в переменной, чтобы, когда пользователь заполняет форму в боте, имя было записано.

Вот клиентское приложение в SharePoint, которое я использую для отправки имени пользователя через обратный канал Directline.

private _showPanel = (): void => {
this.setState({ showPanel: true });

// Get the user name
var req = new XMLHttpRequest();
req.open("GET", "/_api/SP.UserProfiles.PeopleManager/GetMyProperties", false);
req.setRequestHeader("Accept", "application/json");
req.send();
var user = { id: "userid", name: "unknown" };
if (req.status == 200) {
  var result = JSON.parse(req.responseText);
  user.id = result.Email;
  user.name = result.DisplayName;
  var userName = user.name
  console.log("Bot loaded for "+userName)
}

directLine
.postActivity({ type: "event", name: "SendUserInfo", text: user.name, from: { id: "userid" } })
.subscribe(id => console.log("Backchannel event success"));
 };

Бот отслеживает событие в файле DialogBot.js.

// Listen for the event 'SendUserInfo' and store the user name in a variable
this.onEvent(async (context, next) => {
  if (context.activity.name === 'SendUserInfo') {
            var userName = await context.sendActivity(context.activity.text);
            console.log(userName);
        }
        await next();
    });

Я пытаюсь вызвать эту переменную в моем файле functionaDialogBase.js, чтобы ее можно было использовать, когда пользователь отправляет форму

const { userName } = require('../dialogbot');
{...}
 var authCtx = new AuthenticationContext(settings.siteurl);
 authCtx.acquireTokenForApp(settings.clientId, settings.clientSecret, function (err, data) {

var ctx = new SP.ClientContext("/sites/demosite");
authCtx.setAuthenticationCookie(ctx);
    var web = ctx.get_web();
    var list = web.get_lists().getByTitle('BotBookings');
    var creationInfo = new SP.ListItemCreationInformation();
    var listItem = list.addItem(creationInfo);
    listItem.set_item('UserName', userName);
    listItem.set_item('Title', title);
    listItem.set_item('SessDate', booksessjson2);
    listItem.set_item('SessTime', booksessjson3);
    listItem.update();
    ctx.load(listItem);
    ctx.executeQueryAsync();
    });

Когда я заполняю форму, поле userName остается пустым, и я ожидаю увидеть имя пользователя в этом столбце.

Спасибо за уделенное время.


person Steve Johnson    schedule 12.10.2019    source источник


Ответы (1)


Лучше поздно, чем никогда, но в итоге я решил это довольно просто. Если кто-то еще сталкивается с подобной проблемой, я использовал функцию экспорта. Так что вместо

// Listen for the event 'SendUserInfo' and store the user name in a variable
this.onEvent(async (context, next) => {
if (context.activity.name === 'SendUserInfo') {
        var userName = context.activity.from.id;
        console.log(userName);
    }
    await next();

я использовал

// Listen for the event 'SendUserInfo' and store the user name in a variable
this.onEvent(async (context, next) => {
 if (context.activity.name === 'SendUserInfo') {
        exports.userName = context.activity.from.id;
        console.log(userName);
    }
    await next();

Я смог вызвать строку, используя;

const { userName } = require('fileref').userName
person Steve Johnson    schedule 18.07.2020