首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >团队机器人。"TypeError: source.on不是'createConversation‘方法中的函数“

团队机器人。"TypeError: source.on不是'createConversation‘方法中的函数“
EN

Stack Overflow用户
提问于 2019-10-18 07:34:44
回答 4查看 1.4K关注 0票数 0

我有一个团队node.js机器人在本地运行(带有ngrok)。我收到来自团队客户端和echo works的消息。

代码语言:javascript
复制
context.sendActivity(`You said '${context.activity.text}'`);

我需要发送一个积极主动的信息,但是我在创建对话pbject时出错了。

我的代码:

代码语言:javascript
复制
...
await BotConnector.MicrosoftAppCredentials.trustServiceUrl(sServiceUrl);

var credentials = new BotConnector.MicrosoftAppCredentials({
    appId: "XXXXXXXXXXXX",
    appPassword: "YYYYYYYYYYYYY"
});

var connectorClient = new BotConnector.ConnectorClient(credentials, { baseUri: sServiceUrl });

const parameters = {
    members: [{ id: sUserId }],
    isGroup: false,
    channelData:
    {
        tenant: {
            id: sTenantId
        }
    }
};

// Here I get the error: "TypeError: source.on is not a function"
var conversationResource = await connectorClient.conversations.createConversation(parameters);

await connectorClient.conversations.sendToConversation(conversationResource.id, {
   type: "message",
   from: { id: credentials.appId },
   recipient: { id: sUserId },
   text: 'This a message from Bot Connector Client (NodeJS)'
});

字符串值是正确的,并且我有一个有效的connectorClient。

提前谢谢你,

迭戈

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-10-28 08:26:41

我发现了我的问题。我必须按照正确的顺序设置凭据/主管/信任:

代码语言:javascript
复制
credentials = new MicrosoftAppCredentials(process.env.MicrosoftAppId, process.env.MicrosoftAppPassword);

connectorClient = new ConnectorClient(credentials, { baseUri: activity.serviceUrl });

MicrosoftAppCredentials.trustServiceUrl(activity.serviceUrl);
票数 0
EN

Stack Overflow用户

发布于 2019-10-18 22:42:50

我认为你很接近,但只是需要做一些修改。很难说,因为我看不清你所有的代码。

在这里,我将团队中间件添加到index.js中的适配器中,并进行调用,从mainDialog.js的瀑布步骤中触发主动消息。只要您可以传递context,代码的位置就不重要了。

另外,关于您的消息构造,仅发送文本就足够了。收信人已在参数中指定,其余的活动属性通过连接器分配。没有必要重建活动(除非您真的需要)。

最后,一定要信任serviceUrl。我是通过onTurn方法在mainBot.js中这样做的。

希望得到帮助!

index.js

代码语言:javascript
复制
const teams = require('botbuilder-teams');

const adapter = new BotFrameworkAdapter({
  appId: process.env.MicrosoftAppId,
  appPassword: process.env.MicrosoftAppPassword
})
  .use(new teams.TeamsMiddleware())

mainDialog.js

代码语言:javascript
复制
const { ConnectorClient, MicrosoftAppCredentials } = require('botframework-connector');

async teamsProactiveMessage ( stepContext ) {
  const credentials = new MicrosoftAppCredentials(process.env.MicrosoftAppId, process.env.MicrosoftAppPassword);
  const connector = new ConnectorClient(credentials, { baseUri: stepContext.context.activity.serviceUrl });
  const roster = await connector.conversations.getConversationMembers(stepContext.context.activity.conversation.id);

  const parameters = {
    members: [
      {
        id: roster[0].id
      }
    ],
    channelData: {
      tenant: {
        id: roster[0].tenantId
      }
    }
  };

  const conversationResource = await connector.conversations.createConversation(parameters);
  const message = MessageFactory.text('This is a proactive message');
  await connector.conversations.sendToConversation(conversationResource.id, message);

  return stepContext.next();
}

mainBot.js

代码语言:javascript
复制
this.onTurn(async (context, next) => {
  if (context.activity.channelId === 'msteams') {
    MicrosoftAppCredentials.trustServiceUrl(context.activity.serviceUrl);
  }
  await next();
});

票数 0
EN

Stack Overflow用户

发布于 2019-10-21 07:36:23

我用Yeoman创建了我的机器人,所以我有了一个运行示例,它可以响应传入的消息。https://learn.microsoft.com/es-es/azure/bot-service/javascript/bot-builder-javascript-quickstart?view=azure-bot-service-4.0

这样,我就可以对传入的消息做出响应,并且它可以工作。

我的完整代码:

index.js: //自动创建,而不是修改

代码语言:javascript
复制
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

const dotenv = require('dotenv');
const path = require('path');
const restify = require('restify');

// Import required bot services.
// See https://aka.ms/bot-services to learn more about the different parts of a bot.
const { BotFrameworkAdapter } = require('botbuilder');

// This bot's main dialog.
const { MyBot } = require('./bot');

// Import required bot configuration.
const ENV_FILE = path.join(__dirname, '.env');
dotenv.config({ path: ENV_FILE });

// Create HTTP server
const server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, () => {
    console.log(`\n${ server.name } listening to ${ server.url }`);
    console.log(`\nGet Bot Framework Emulator: https://aka.ms/botframework-emulator`);
    console.log(`\nTo test your bot, see: https://aka.ms/debug-with-emulator`);
});

// Create adapter.
// See https://aka.ms/about-bot-adapter to learn more about how bots work.
const adapter = new BotFrameworkAdapter({
    appId: process.env.MicrosoftAppId,
    appPassword: process.env.MicrosoftAppPassword
});

// Catch-all for errors.
adapter.onTurnError = async (context, error) => {
    // This check writes out errors to console log .vs. app insights.
    console.error(`\n [onTurnError]: ${ error }`);
    // Send a message to the user
    await context.sendActivity(`Oops. Something went wrong!`);
};

// Create the main dialog.
const myBot = new MyBot();

// Listen for incoming requests.
server.post('/api/messages', (req, res) => {
    adapter.processActivity(req, res, async (context) => {
        // Route to main dialog.
        await myBot.run(context);
    });
});

我的机器人档案。bot.js //自动创建,修改以添加主动消息

代码语言:javascript
复制
   const { ConnectorClient, MicrosoftAppCredentials, BotConnector } = require('botframework-connector');
   const { ActivityHandler } = require('botbuilder');

   class MyBot extends ActivityHandler {

    constructor() {
        super();
        // See https://aka.ms/about-bot-activity-message to learn more about the message and other activity types.
        this.onMessage(async (context, next) => {
            //await context.sendActivity(`You said '${context.activity.text}'`); // It works
            var activity = context.activity;
            await MicrosoftAppCredentials.trustServiceUrl(activity.serviceUrl);
            var connectorClient = new ConnectorClient(credentials, { baseUri: activity.serviceUrl });
            const parameters = {
                members: [{ id: activity.from.id }],
                isGroup: false,
                channelData:
                {
                    tenant: {
                        id: activity.conversation.tenantId
                    }
                }
            };
        var conversationResource = await connectorClient.conversations.createConversation(parameters);  

    });
}

module.exports.MyBot = MyBot;

在“createConversation”中,我得到了错误:

代码语言:javascript
复制
 [onTurnError]: TypeError: source.on is not a function

这段代码将在一个方法中,为了在需要时调用它,我把它放在'onMessage‘中只是为了简化

我想我的密码和你的一样..。但恐怕我错过了什么或做错了什么.

谢谢你的帮忙,

迭戈

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58446023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档